我有非常具体的情况。我想将QAction
放入QToolbar
并达到以下行为:
QAction
。QDialog
应显示在屏幕上,而不是QMenu
- 就像一个现在我对将所有这些事情一起实施感到困惑。
目前我已创建QAction
将其添加到工具栏中,并创建了一个空的QMenu
,因为我还没有想到如何添加"下拉"箭头另一种方式。
所以,我也将我的广告连接到QMenu
aboutToShow()
信号,现在,我可以在exec()
显示之前创建我的对话框和QMenu
。但是现在出现的主要问题是:在我使用对话框完成所有操作后,点击OK
按钮QMenu
尝试显示,但由于它是空的,因此无显示任何内容,只有在我左键单击somwhere到"关闭"这个菜单。
有没有办法强迫QMenu
不显示或可以继承QMenu
并重新实现其行为(我已尝试使用exec()
{{继承自show()
之后{}} popup()
的方法,但是当菜单出现在屏幕上时,它们都没有被调用)?
答案 0 :(得分:6)
这是解决方案,对我有用。
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
}
}
它在每个平台上运行良好,并且做我想要的。 希望,这会有所帮助。我花了一周时间试图找到这个解决方案。