QMenu多次激活

时间:2016-01-19 07:24:51

标签: c++ qt qt-signals

我正在讨论提到here的Qt演示浏览器示例,当我尝试对书签处理代码进行细微更改时,我发现了一个异常现象。

我的目的是让工具栏中的书签在新标签中打开,而不是现有标签。它适用于直接位于书签选项卡上的书签。但是文件夹中的书签是表现奇怪的书签。

我修改了bookmarks.cpp中的BookmarksToolBar::activated SLOT,以便在新标签中打开网址而不是现有标签。当我注意到多次调用SLOT时,计数等于菜单呈现的次数。即,第一次激活菜单项时,SLOT被调用一次,下次激活一个项目时,SLOT会被调用两次,依此类推。

我认为必须有多个信号槽连接,因此我检查了信号槽连接完成的BookmarksToolBar::build()方法,发现控制流只进入方法一次。我发现很难弄清楚SLOT被多次调用的方式。

项目问题是一个示例项目' Tab浏览器'它附带Qt,可以通过点击'例子'来访问。在Qt-Creator欢迎屏幕上。因此我没有在这里发布任何源代码。

理解此异常原因的任何指导或帮助以及解决此问题的可能解决方案将不胜感激。

1 个答案:

答案 0 :(得分:1)

找到问题的原因并自行解决。问题的根源在modelmenu.cpp

显然,ModelMenu::createMenu方法每次调用方法时都会将QMenu::triggeredQMenu::hovered信号连接到SLOT。 SLOT触发发出信号ModelMenu::activated

使用Qt::UniqueConnection可以解决问题。

取而代之:

connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(triggered(QAction*)));
connect(menu, SIGNAL(hovered(QAction*)), this, SLOT(hovered(QAction*)));

有了这个:

connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(triggered(QAction*)),Qt::UniqueConnection);
connect(menu, SIGNAL(hovered(QAction*)), this, SLOT(hovered(QAction*)),Qt::UniqueConnection);

修正了问题。离开这里希望这将有助于将来。