Don't show QPushButton as hovered unless the mouse is within the bevel
Previous fixes made QPushButton correctly respect the style sheet boxing model (as it's documented to do), ignoring clicks that were within the margin area of the button (ie outside the bevel). However, a hover state selector in the style sheet would still be used for the entire widget. Turn on mouse tracking for widgets that have a hover state selector, and handle mouseMoveEvent to set an explicit hovered state only when the mouse hits the button. Use that state to initialize the style option. Fixes: QTBUG-87706 Change-Id: I2f423b760c85cfab9faac4be44a5c7dcf2ba1c23 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>bb10
parent
875a7fad52
commit
3310e13a17
|
|
@ -2863,6 +2863,7 @@ void QStyleSheetStyle::polish(QWidget *w)
|
|||
if ( cssClass & PseudoClass_Hover || negated & PseudoClass_Hover) {
|
||||
w->setAttribute(Qt::WA_Hover);
|
||||
embeddedWidget(w)->setAttribute(Qt::WA_Hover);
|
||||
embeddedWidget(w)->setMouseTracking(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -330,6 +330,8 @@ void QPushButton::initStyleOption(QStyleOptionButton *option) const
|
|||
option->state |= QStyle::State_On;
|
||||
if (!d->flat && !d->down)
|
||||
option->state |= QStyle::State_Raised;
|
||||
if (underMouse())
|
||||
option->state.setFlag(QStyle::State_MouseOver, d->hovering);
|
||||
option->text = d->text;
|
||||
option->icon = d->icon;
|
||||
option->iconSize = iconSize();
|
||||
|
|
@ -506,6 +508,25 @@ void QPushButton::focusOutEvent(QFocusEvent *e)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
void QPushButton::mouseMoveEvent(QMouseEvent *e)
|
||||
{
|
||||
Q_D(QPushButton);
|
||||
|
||||
if (testAttribute(Qt::WA_Hover)) {
|
||||
bool hit = false;
|
||||
if (underMouse())
|
||||
hit = hitButton(e->position().toPoint());
|
||||
|
||||
if (hit != d->hovering) {
|
||||
update(rect());
|
||||
d->hovering = hit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\reimp
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ protected:
|
|||
void keyPressEvent(QKeyEvent *) override;
|
||||
void focusInEvent(QFocusEvent *) override;
|
||||
void focusOutEvent(QFocusEvent *) override;
|
||||
void mouseMoveEvent(QMouseEvent *) override;
|
||||
virtual void initStyleOption(QStyleOptionButton *option) const;
|
||||
bool hitButton(const QPoint &pos) const override;
|
||||
QPushButton(QPushButtonPrivate &dd, QWidget* parent = nullptr);
|
||||
|
|
|
|||
|
|
@ -69,7 +69,9 @@ public:
|
|||
|
||||
QPushButtonPrivate()
|
||||
: QAbstractButtonPrivate(QSizePolicy::PushButton), autoDefault(Auto),
|
||||
defaultButton(false), flat(false), menuOpen(false), lastAutoDefault(false) {}
|
||||
defaultButton(false), flat(false), menuOpen(false), hovering(false),
|
||||
lastAutoDefault(false)
|
||||
{}
|
||||
|
||||
inline void init() { resetLayoutItemMargins(); }
|
||||
static QPushButtonPrivate* get(QPushButton *b) { return b->d_func(); }
|
||||
|
|
@ -89,6 +91,7 @@ public:
|
|||
uint defaultButton : 1;
|
||||
uint flat : 1;
|
||||
uint menuOpen : 1;
|
||||
uint hovering : 1;
|
||||
mutable uint lastAutoDefault : 1;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue