以编程方式调用QContextMenuEvent来显示一个QMenu



我想在没有用户交互的QWidget上弹出一个未折叠的QMenu。目前,我得到的QMenu在其他空QWidget右键单击后。是否有任何方法来调用一个contextMenuEvent(QContextMenuEvent *事件)信号编程?

作为一种选择,我可以在菜单栏中添加一个菜单。然而,这是崩溃的。能不能显示菜单没有折叠?我对任何主意都很高兴。谢谢!编辑:代码片段
 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并没有真正添加到小部件中。但我现在不知道如何添加它而不使用菜单栏:-(.

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

相关内容

  • 没有找到相关文章

最新更新