gpt4 book ai didi

qt - 如何以编程方式关闭 QMenu

转载 作者:行者123 更新时间:2023-12-02 22:33:33 27 4
gpt4 key购买 nike

我的情况非常具体。我想将 QAction 放入 QToolbar 并达到以下行为:

  1. 可检查带有图标的QAction
  2. 右侧的经典箭头,用于显示菜单
  3. 通过按此箭头,我的 QDialog 应该出现在屏幕上,而不是像 QMenu 那样的

现在我对同时实现所有这些事情感到有点困惑。

现在我已经创建了 QAction 将其添加到工具栏,还创建了一个空的 QMenu 因为我不知道如何添加“下拉菜单” “箭头指向另一个方向。
因此,我还将插槽连接到 QMenu aboutToShow() 信号,现在,我可以创建对话框和 exec()它就在 QMenu 显示之前。但主要问题出现了:在我对对话框执行完所有操作后,单击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
}
}

它在每个平台上都运行良好,并且达到了我想要的效果。希望这会对某人有所帮助。我花了一周时间试图找到这个解决方案。

关于qt - 如何以编程方式关闭 QMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32333250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com