QColorDialog: Fix picking screen colors inside QColorPicker
If you click "Pick screen color" and move mouse over QColorPicker (the square with gradients) unexpected things will happen: black will be picked half the times. This is because QColorPicker's black cross is painted under our mouse cursor. Although "pick screen color"'s use case is to pick colors in other windows, there's no reason to not make it work on QColorDialog itself too. Task-number: QTBUG-43288 Change-Id: I03ca02148cc15ad41d545723d4ac4f5a82842b4b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>bb10
parent
dc469691a9
commit
37fa842f41
|
|
@ -627,6 +627,7 @@ public:
|
|||
QColorPicker(QWidget* parent);
|
||||
~QColorPicker();
|
||||
|
||||
void setCrossVisible(bool visible);
|
||||
public slots:
|
||||
void setCol(int h, int s);
|
||||
|
||||
|
|
@ -650,6 +651,7 @@ private:
|
|||
void setCol(const QPoint &pt);
|
||||
|
||||
QPixmap pix;
|
||||
bool crossVisible;
|
||||
};
|
||||
|
||||
static int pWidth = 220;
|
||||
|
|
@ -805,6 +807,7 @@ void QColorPicker::setCol(const QPoint &pt)
|
|||
|
||||
QColorPicker::QColorPicker(QWidget* parent)
|
||||
: QFrame(parent)
|
||||
, crossVisible(true)
|
||||
{
|
||||
hue = 0; sat = 0;
|
||||
setCol(150, 255);
|
||||
|
|
@ -817,6 +820,14 @@ QColorPicker::~QColorPicker()
|
|||
{
|
||||
}
|
||||
|
||||
void QColorPicker::setCrossVisible(bool visible)
|
||||
{
|
||||
if (crossVisible != visible) {
|
||||
crossVisible = visible;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
QSize QColorPicker::sizeHint() const
|
||||
{
|
||||
return QSize(pWidth + 2*frameWidth(), pHeight + 2*frameWidth());
|
||||
|
|
@ -858,12 +869,13 @@ void QColorPicker::paintEvent(QPaintEvent* )
|
|||
QRect r = contentsRect();
|
||||
|
||||
p.drawPixmap(r.topLeft(), pix);
|
||||
QPoint pt = colPt() + r.topLeft();
|
||||
p.setPen(Qt::black);
|
||||
|
||||
p.fillRect(pt.x()-9, pt.y(), 20, 2, Qt::black);
|
||||
p.fillRect(pt.x(), pt.y()-9, 2, 20, Qt::black);
|
||||
|
||||
if (crossVisible) {
|
||||
QPoint pt = colPt() + r.topLeft();
|
||||
p.setPen(Qt::black);
|
||||
p.fillRect(pt.x()-9, pt.y(), 20, 2, Qt::black);
|
||||
p.fillRect(pt.x(), pt.y()-9, 2, 20, Qt::black);
|
||||
}
|
||||
}
|
||||
|
||||
void QColorPicker::resizeEvent(QResizeEvent *ev)
|
||||
|
|
@ -1578,6 +1590,7 @@ void QColorDialogPrivate::_q_pickScreenColor()
|
|||
void QColorDialogPrivate::releaseColorPicking()
|
||||
{
|
||||
Q_Q(QColorDialog);
|
||||
cp->setCrossVisible(true);
|
||||
q->removeEventFilter(colorPickingEventFilter);
|
||||
q->releaseMouse();
|
||||
q->releaseKeyboard();
|
||||
|
|
@ -2174,6 +2187,9 @@ void QColorDialog::changeEvent(QEvent *e)
|
|||
|
||||
bool QColorDialogPrivate::handleColorPickingMouseMove(QMouseEvent *e)
|
||||
{
|
||||
// If the cross is visible the grabbed color will be black most of the times
|
||||
cp->setCrossVisible(!cp->geometry().contains(e->pos()));
|
||||
|
||||
const QPoint globalPos = e->globalPos();
|
||||
const QColor color = grabScreenColor(globalPos);
|
||||
// QTBUG-39792, do not change standard, custom color selectors while moving as
|
||||
|
|
|
|||
Loading…
Reference in New Issue