如何以编程方式关闭QMenu



我有一个非常特殊的情况。我想将QAction放入QToolbar并达到以下行为:

  1. Checkable QAction with icon.
  2. 右侧的经典箭头,用于显示菜单
  3. 按下这个箭头,我的QDialog应该出现在屏幕上,而不是像QMenu那样的

现在我有点困惑的实现所有这些东西在一起。

现在我已经创建了QAction,并将其添加到工具栏中,同时还创建了一个空的QMenu,因为我不知道如何以另一种方式添加"下拉"箭头。所以,我也将我的插槽连接到QMenu aboutToShow()信号,现在,我可以在QMenu显示之前创建我的对话框和exec()。但这里出现了主要问题:在我用我的对话框做了一切之后,单击OK按钮QMenu试图出现,但由于它是空的,它没有显示任何内容,只有在我左键单击某个地方"关闭"此菜单后,才能使用进一步的操作。

是否有办法强迫QMenu不显示或可以从QMenu继承并重新实现其行为(我曾试图用exec() show() popup() QMenu的方法从它子类化后这样做,但当菜单出现在屏幕上时,它们都没有被调用)?

这是我的解决方案。

class QCustomMenu : public QMenu
{
  Q_OBJECT
public:
  QCustomMenu(QObject *parent = 0):QMenu(parent){};
};
在代码:

QAction* myActionWithMenu = new QAction ( "ActionText", toolbar);
QCustomMenu* myMenu = new QCustomMenu(toolbar);
connect(myMenu, SIGNAL(aboutToShow()), this, SLOT(execMyMenu()));

execMyMenu()实现:

void execMyMenu(){
  m_activeMenu = (QCustomMenu*)sender(); // m_activeMenu -- private member of your head class, needs to point to active custom menu
  QMyDialog* dlg = new QMyDialog();
  // setup your dialog with needed information
  dlg->exec();
  // handle return information
  m_myTimer = startTimer(10); // m_myTimer -- private member of your head(MainWindow or smth like that) class
}

现在我们必须处理timerEvent并关闭我们的菜单:

void MyHeadClass::timerEvent(QTimerEvent *event)
{
    // Check if it is our "empty"-menu timer 
    if ( event->timerId()==m_myTimer )
    {
        m_activeMenu->close(); // closing empty menu
        killTimer(m_myTimer);  // deactivating timer
        m_myTimer = 0;         // seting timer identifier to zero
        m_activeMenu = NULL;   // as well as active menu pointer to NULL
    }
}

它在每个平台上都运行得很好,并且做了我想要的。希望这能帮到别人。我花了一个星期的时间来寻找这个解决方案。

相关内容

  • 没有找到相关文章

最新更新