为禁用的 QToolButton 启用 QMenu 访问
Posted
技术标签:
【中文标题】为禁用的 QToolButton 启用 QMenu 访问【英文标题】:Enable QMenu access for a disabled QToolButton 【发布时间】:2014-08-08 07:46:08 【问题描述】:我有一个QToolButton
和一个附加的QMenu
,其中包括几个QActions
。
其中一项操作是按钮的默认操作。单击操作时默认操作会动态更改,效果很好。
现在,这些QActions
被信号启用和禁用。当(当前)默认操作被禁用时,QToolButton
也会被禁用。
这会导致无法访问的 QMenu
仍然包含我希望能够选择的已启用的 QMenu
条目 (QActions
)。
那么:当默认操作获得setEnabled(false)
时,我还能以某种方式使菜单可用吗?还是有其他的想法?
【问题讨论】:
【参考方案1】:我执行了以下操作来完全解决所描述的问题:
在我的QToolButton
类中,我覆盖eventFilter
,如下所示:
bool MultiToolButton::eventFilter( QObject* inObject, QEvent* inEvent )
MultiToolButton* _multiToolButton =
dynamic_cast<MultiToolButton*>(inObject);
QMouseEvent* _mouseEvent = dynamic_cast<QMouseEvent*>(inEvent);
if(_multiToolButton
&& _mouseEvent && _mouseEvent->type() == QEvent::MouseButtonPress)
mMenu.setEnabled(true);
showMenu();
return true;
return QToolButton::eventFilter(inObject, inEvent);
并将以下行添加到构造函数:
installEventFilter(this);
仍然感谢您的回答。但是,我没有检查它。
【讨论】:
我使用了这个解决方案的一个变体(谢谢!)。有没有办法正确绘制菜单箭头(启用而不是禁用)?【参考方案2】:您可以天真地编写一个小函数,每当您禁用 QAction
时调用它,以查看它是否是当前的默认操作,如下所示:
void MyDialog::on_button_clicked()
action2->setEnabled( false );
checkForDefault(action2);
void MyDialog::checkForDefault(QAction *action)
if ( tButton->defaultAction() == action )
QList<QAction*> list = tButton->menu()->actions();
int index = list.indexOf(action);
QAction *newDefault = list.at( ( index+1 ) % list.count() );
tButton->setDefaultAction(newDefault);
tButton->setEnabled(true);
这将检查被更改的操作是否是按钮的当前默认操作,如果是,则选择QMenu
中的下一个QAction
作为新的默认操作(如果禁用的操作是最后在列表中)。
另一种方法可能是让您自己的类继承自 QToolButton
并重载其 actionEvent ( QActionEvent * event )
方法以执行您需要的操作。
这有什么帮助吗?
【讨论】:
【参考方案3】:箭头被禁用的问题可以通过以下样式表来解决,它将标准箭头替换为位于 url path_to_arrow
中的图像。当按钮禁用时,此图像不会更改:
QToolButton::menu-indicator,::menu-button
QToolButton::menu-arrow
image: url("path_to_arrow");
【讨论】:
以上是关于为禁用的 QToolButton 启用 QMenu 访问的主要内容,如果未能解决你的问题,请参考以下文章