【发布时间】:2019-07-31 20:39:08
【问题描述】:
我的应用程序有一个QMenuBar 和多个QMenus,每个QActions 和子QMenus 的数量。
大多数QAction-items 是QWidgetAction 的派生类,并重新实现了QWidgetAction::createWidget 方法。
通常,QActions 和 QMenu 在鼠标悬停时都会突出显示。
即使是QWidgetAction 在这里也不会惹麻烦:
但只要我覆盖 QWidgetAction::createWidget 以返回自定义 QWidget
QWidget* MyWidgetAction::createWidget(QWidget* parent) { return new MyWidget(parent); }
高亮不再起作用。于是我自己实现了:
void MyWidget::set_highlighted(bool h)
{
setBackgroundRole(h ? QPalette::Highlight : QPalette::Window);
setAutoFillBackground(h);
}
void MyWidget::enterEvent(QEvent*) override { set_highlighted(true); }
void MyWidget::leaveEvent(QEvent*) override { set_highlighted(false); }
但是,它的行为并不像预期的那样:
我已经发现 enterEvent 方法在所有子菜单关闭之前不会被调用,这只会在鼠标离开子菜单或其操作后发生一些延迟(顺便说一句,我该如何更改延迟?) .与鼠标移动事件相同。
问题:如何正确地重新实现 highlight-on-hover?用户不会注意到自定义小部件和标准 QAction 的行为不同。
默认的QWidgetAction::createWidget 有什么作用,如何重现它?我已经看过Qt's source,但它很混乱。
【问题讨论】:
-
MyWidget是否已经覆盖enterEvent和leaveEvent,或者只是作为您尝试解决问题的一部分? -
我只覆盖它们来解决问题。
标签: c++ qt user-interface qt5 qmenu