为禁用的 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 访问的主要内容,如果未能解决你的问题,请参考以下文章

除非使用 PySide 恰好选择了一项,否则禁用菜单项

Qt QAction 动态数组连接

java ssm 框架解决思路 状态 操作 启用 禁用 启用 禁用 启用 禁用 点击“禁用” 启动状态就变为“禁用”

修复 QToolButton 图标

使用 SwiftUI 为启用/禁用按钮设置颜色的最智能方法

如何部分启用/禁用远程推送通知客户端?