为禁用的QToolButton启用QMenu访问

时间:2014-08-08 07:46:08

标签: qt qtgui qmenu qaction

我有QToolButton附加QMenu,其中包含几个QActions。 其中一个操作是按钮的默认操作。单击操作时,默认操作会动态更改,这很有效。

现在,这些QActions被信号启用和禁用。当(当前)默认操作被禁用时,QToolButton也会被禁用。

这导致无法访问的QMenu仍然包含我希望能够选择的已启用QMenu条目(QActions)。

所以:当默认操作获得setEnabled(false)时,我还能以某种方式使菜单可用吗?或者还有其他想法吗?

3 个答案:

答案 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");

}