【问题标题】:Invoke QContextMenuEvent programmatically to show a QMenu以编程方式调用 QContextMenuEvent 以显示 QMenu
【发布时间】:2014-08-26 15:27:28
【问题描述】:

我想在没有用户交互的情况下在 QWidget 上弹出一个未折叠的 QMenu。目前,右键单击后,我在原本为空的 QWidget 上获得了 QMenu。有没有办法以编程方式调用 contextMenuEvent(QContextMenuEvent *event) 信号?

作为替代方案,我可以向菜单栏添加一个菜单。然而,这是崩溃的。是否可以显示未折叠的菜单?

我很高兴有任何想法。谢谢!

编辑:代码 sn-p

 TestMenu::TestMenu(QWidget *parent)
 : QWidget(parent)
{
   ui.setupUi(this);
  //remove frame from widget
   this->setWindowFlags(Qt::FramelessWindowHint );
  //add menu
  QMenu menu(this);
  QAction* firstEntry = new QAction(tr("Ask a question"), this);
  connect(firstEntry, SIGNAL(triggered()), this, SIGNAL(askCollegueDialogRequested()));
  menu.addAction(firstEntry);
  menu.popup(this->mapToGlobal(QPoint(0,0)));
  menu.activateWindow();
 }

我只看到没有菜单的空小部件。我从另一个类调用小部件的 show()。问题可能是 QMenu 并没有真正添加到小部件中。但我现在不知道如何在不使用菜单栏的情况下添加它:-(。

【问题讨论】:

    标签: qt4 qmenu


    【解决方案1】:

    使用QMenu::popup()。例如:

    menu->popup( widget->mapToGlobal(QPoint(0,0)) );
    menu->activateWindow(); // this is needed if the menu cannot be controlled with keyboard.
    

    针对已编辑问题的更新 1: 在您的情况下,您不应该在堆栈上创建 QMenu,它将在构造函数退出之前自动删除。而是在堆上创建它。而且您无法在构造函数中弹出菜单,它只会短暂出现并消失。稍后使用 QTimer::singleShot 显示。

    m_contextMenu = new QMenu(this);
    
    QAction* firstEntry = new QAction(tr("Ask a question"), this);
    connect(firstEntry, SIGNAL(triggered()), this, SIGNAL(askCollegueDialogRequested()));
    m_contextMenu->addAction(firstEntry);
    
    QTimer::singleShot(0, this, SLOT(showMenu()));
    

    显示菜单:

    void TestMenu::showMenu()
    {
      m_contextMenu->popup(this->mapToGlobal(QPoint(0, 0)));
      m_contextMenu->activateWindow();    
    }
    

    【讨论】:

    • 非常感谢!我添加了一些代码,包括您的建议。我看不到 QMenu。我有什么遗漏吗?
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2011-09-05
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多