【问题标题】:Enable QMenu access for a disabled QToolButton为禁用的 QToolButton 启用 QMenu 访问
【发布时间】:2014-08-08 07:46:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: qt qtgui qmenu qaction


    【解决方案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");
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        相关资源
        最近更新 更多