我有QToolButton
附加QMenu
,其中包含几个QActions
。
其中一个操作是按钮的默认操作。单击操作时,默认操作会动态更改,这很有效。
现在,这些QActions
被信号启用和禁用。当(当前)默认操作被禁用时,QToolButton
也会被禁用。
这导致无法访问的QMenu
仍然包含我希望能够选择的已启用QMenu
条目(QActions
)。
所以:当默认操作获得setEnabled(false)
时,我还能以某种方式使菜单可用吗?或者还有其他想法吗?
答案 0 :(得分: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);
尽管如此,谢谢你的回答。但是,我没有检查它。
答案 1 :(得分:0)
天真地你可以做的就是编写一个小函数,只要你禁用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);
}
}
这将检查更改的操作是否是按钮的当前默认操作,如果是,将选择QAction
中的下一个QMenu
作为新默认值(或者如果是禁用的动作是列表中的最后一个。)
另一种方法可能是让您自己的类继承自QToolButton
并重载其actionEvent ( QActionEvent * event )
方法以执行您需要的操作。
这有任何帮助吗?
答案 2 :(得分:0)
可以通过以下样式表解决箭头被禁用的问题,该样式表将标准箭头替换为位于URL path_to_arrow
中的图像。当按钮禁用:
QToolButton::menu-indicator,::menu-button
{
}
QToolButton::menu-arrow
{
image: url("path_to_arrow");
}