【问题标题】:How to programmatically close QMenu如何以编程方式关闭 QMenu
【发布时间】:2015-11-26 18:53:03
【问题描述】:

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

  1. 可通过图标检查QAction。
  2. 右侧经典箭头,用于显示菜单
  3. 按此箭头,我的 QDialog 应该会出现在屏幕上,而不是像 QMenu 一样

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

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

有什么方法可以强制 QMenu 不显示或可以从 QMenu 继承并重新实现其行为(我尝试使用 exec() show() popup() 的方法来实现这种技巧QMenu 从它子类化之后,但是当菜单出现在屏幕上时,它们都没有被调用)?

【问题讨论】:

    标签: qt user-interface qdialog qmenu


    【解决方案1】:

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

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

    它在每个平台上都运行良好,并且可以满足我的需求。 希望,这会对某人有所帮助。我花了一周的时间试图找到这个解决方案。

    【讨论】:

    • 那里有内存泄漏。你必须在你的构造函数初始化中调用QMenu( parent )。
    • 非常感谢!我完全忘记了这件事
    • @SaZ 现在发生了奇怪的事情:在 Windows 中它运行良好,但在 Linux 下关闭菜单对话框会导致所有工具栏冻结。可能是我忘记了什么?
    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 2020-07-08
    • 2013-07-04
    • 2010-11-17
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多