我有一个非常特殊的情况。我想将QAction
放入QToolbar
并达到以下行为:
- Checkable
QAction
with icon. - 右侧的经典箭头,用于显示菜单
- 按下这个箭头,我的
QDialog
应该出现在屏幕上,而不是像QMenu
那样的
现在我有点困惑的实现所有这些东西在一起。
现在我已经创建了QAction
,并将其添加到工具栏中,同时还创建了一个空的QMenu
,因为我不知道如何以另一种方式添加"下拉"箭头。所以,我也将我的插槽连接到QMenu
aboutToShow()
信号,现在,我可以在QMenu
显示之前创建我的对话框和exec()
。但这里出现了主要问题:在我用我的对话框做了一切之后,单击OK
按钮QMenu
试图出现,但由于它是空的,它没有显示任何内容,只有在我左键单击某个地方"关闭"此菜单后,才能使用进一步的操作。
是否有办法强迫QMenu
不显示或可以从QMenu
继承并重新实现其行为(我曾试图用exec()
show()
popup()
QMenu
的方法从它子类化后这样做,但当菜单出现在屏幕上时,它们都没有被调用)?
这是我的解决方案。
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
}
}
它在每个平台上都运行得很好,并且做了我想要的。希望这能帮到别人。我花了一个星期的时间来寻找这个解决方案。