防止 QMenu 在其 QAction 之一未触发时关闭

Posted

技术标签:

【中文标题】防止 QMenu 在其 QAction 之一未触发时关闭【英文标题】:Prevent a QMenu from closing when one of its QAction is not triggered 【发布时间】:2017-01-10 08:50:40 【问题描述】:

我有一个 QMenu 和几个 QWidgetAction,带有复选框,当我尝试单击 QMenu 的任何区域时,菜单会关闭。我想防止这种情况发生。

这是我执行操作和菜单的方式。

QWidgetAction* action = new QWidgetAction(menu);
action->setCheckable(checkable);
action->setData(data);    

QWidget *containerWidget = new QWidget(menu);
QHBoxLayout *hbox = new QHBoxLayout(containerWidget);
QCheckBox *checkBox = new QCheckBox(menu);
checkBox->setText(title);
QObject::connect(checkBox, &QCheckBox::toggled, action, &QAction::trigger);

hbox->addWidget(checkBox);
hbox->addWidget(widget);

QObject::connect(action, &QAction::toggled, [this]()  OnPoiFilterCheckBox(); );
containerWidget->setLayout(hbox);

action->setDefaultWidget(containerWidget);
action->setData(data);
menu->addAction(action);

【问题讨论】:

【参考方案1】:

如图所示使用信号拦截器:

class filter_menu : public QMenu

    Q_OBJECT
public:
    filter_menu(QWidget *parent = 0) : QMenu(parent) 

    virtual void mouseReleaseEvent(QMouseEvent *e)
    
        QAction *action = activeAction();
        if (action && action->isEnabled()) 
            QSignalBlocker blocker(action);
            action->setEnabled(false);
            QMenu::mouseReleaseEvent(e);
            action->setEnabled(true);

        
        else
            QMenu::mouseReleaseEvent(e);
    

;

【讨论】:

以上是关于防止 QMenu 在其 QAction 之一未触发时关闭的主要内容,如果未能解决你的问题,请参考以下文章

QMenu - 快捷方式未触发

如何知道触发了哪个 QMenu 的动作

Qt QAction 动态数组连接

Qt Connect 触发 QMenu 的 SIGNAL

如果 QMenu 是 unique_ptr,为啥 QAction 不添加到 QMenu?

如何将 QMenu 中的 QAction 转换为 QWidget?