2017-01-10 9 views
1

私はQMenuのいくつかの領域をクリックしようとすると、QMenuといくつかのQWidgetActionsをチェックします。私はそれを防止したいと思います。QMenuの1つがトリガーされていないときに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); 
    } 

}; 
関連する問題