我想在没有用户交互的情况下在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并未真正添加到窗口小部件中。但我现在不知道如何在不使用菜单栏的情况下添加它: - (。
答案 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();
}