我正在玩提到here的Qt演示浏览器示例,并在尝试对书签处理代码进行较小更改时发现异常。

我的目的是使工具栏上的书签在新选项卡而不是现有选项卡中打开。它非常适合直接位于书签选项卡上的书签。但是文件夹中的书签表现得很奇怪。

我修改了bookmarks.cpp中的BookmarksToolBar::activated SLOT以在新选项卡而不是现有选项卡中打开URL。那是我注意到SLOT被多次调用的时候,计数等于呈现菜单的次数。即,第一次激活菜单项时,SLOT被调用一次,下次激活菜单项时,SLOT被调用两次,依此类推。

我以为一定有多个信号插槽连接,因此我检查了完成信号插槽连接的BookmarksToolBar::build()方法,发现控制流仅进入该方法一次。我发现很难弄清楚SLOT是如何被多次调用的。

该项目是问题,是Qt随附的示例项目“标签浏览器”,可通过在Qt-Creator欢迎屏幕上单击“示例”来访问。因此,我没有在此处发布任何源代码。

任何指导或帮助理解此异常的原因以及解决该异常的可能解决方案都将受到赞赏。

最佳答案

找到问题的原因并自己解决。问题的根源在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);


解决了问题。只是将其留在这里,希望对将来的人有所帮助。

关于c++ - QMenu多次激活,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34870798/

10-15 04:52