如何以编程方式关闭QMenu

时间:2015-09-01 13:43:01

标签: qt user-interface qdialog qmenu

我有非常具体的情况。我想将QAction放入QToolbar并达到以下行为:

  1. 使用图标检查QAction
  2. 右侧的经典箭头,用于显示菜单
  3. 按此箭头我的QDialog应显示在屏幕上,而不是QMenu - 就像一个
  4. 现在我对将所有这些事情一起实施感到困惑。

    目前我已创建QAction将其添加到工具栏中,并创建了一个空的QMenu,因为我还没有想到如何添加"下拉"箭头另一种方式。
    所以,我也将我的广告连接到QMenu aboutToShow()信号,现在,我可以在exec()显示之前创建我的对话框和QMenu。但是现在出现的主要问题是:在我使用对话框完成所有操作后,点击OK按钮QMenu尝试显示,但由于它是空的,因此无显示任何内容,只有在我左键单击somwhere到"关闭"这个菜单。

    有没有办法强迫QMenu不显示或可以继承QMenu并重新实现其行为(我已尝试使用exec() {{继承自show()之后{}} popup()的方法,但是当菜单出现在屏幕上时,它们都没有被调用)?

1 个答案:

答案 0 :(得分:6)

这是解决方案,对我有用。

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
    }
}

它在每个平台上运行良好,并且做我想要的。 希望,这会有所帮助。我花了一周时间试图找到这个解决方案。