以编程方式调用QContextMenuEvent以显示QMenu

时间:2014-08-26 15:27:28

标签: qt4 qmenu

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

作为替代方案,我可以在菜单栏中添加菜单。但是,这已经崩溃了。是否可以显示菜单未折叠?

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

修改:代码段

 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并未真正添加到窗口小部件中。但我现在不知道如何在不使用菜单栏的情况下添加它: - (。

1 个答案:

答案 0 :(得分:0)

使用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()));

showMenu:

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