QMenu 被多次激活
QMenu activated multiple times
我正在尝试提到的 Qt 演示浏览器示例 here,当我尝试对书签处理代码进行微小更改时发现异常。
我的目的是让工具栏中的书签在新选项卡而不是现有选项卡中打开。它非常适合直接位于书签选项卡上的书签。但是文件夹中的书签是那些行为怪异的书签。
我修改了 bookmarks.cpp 中的 BookmarksToolBar::activated
SLOT
以在新选项卡而不是现有选项卡中打开 url。那时我注意到 SLOT
被多次调用,计数等于菜单呈现的次数。即,第一次激活菜单项时,SLOT
被调用一次,下一次激活菜单项时,SLOT
被调用两次,依此类推。
我认为一定有多个信号槽连接,因此我检查了完成信号槽连接的BookmarksToolBar::build()
方法,发现控制流只进入该方法一次。我发现很难弄清楚 SLOT
是如何被多次调用的。
问题项目是 Qt 附带的示例项目 'Tab browser',可以通过单击 Qt-Creator 欢迎屏幕上的 'Examples' 来访问。因此我没有post这里的任何源代码。
任何有助于理解此异常原因的指导或帮助以及修复它的可能解决方案将不胜感激。
自己找到问题原因和解决方法。问题的根源在modelmenu.cpp.
显然,每次调用该方法时,ModelMenu::createMenu
方法都会将 QMenu::triggered
和 QMenu::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);
已解决问题。就把它留在这里希望这对将来的人有所帮助。
我正在尝试提到的 Qt 演示浏览器示例 here,当我尝试对书签处理代码进行微小更改时发现异常。
我的目的是让工具栏中的书签在新选项卡而不是现有选项卡中打开。它非常适合直接位于书签选项卡上的书签。但是文件夹中的书签是那些行为怪异的书签。
我修改了 bookmarks.cpp 中的 BookmarksToolBar::activated
SLOT
以在新选项卡而不是现有选项卡中打开 url。那时我注意到 SLOT
被多次调用,计数等于菜单呈现的次数。即,第一次激活菜单项时,SLOT
被调用一次,下一次激活菜单项时,SLOT
被调用两次,依此类推。
我认为一定有多个信号槽连接,因此我检查了完成信号槽连接的BookmarksToolBar::build()
方法,发现控制流只进入该方法一次。我发现很难弄清楚 SLOT
是如何被多次调用的。
问题项目是 Qt 附带的示例项目 'Tab browser',可以通过单击 Qt-Creator 欢迎屏幕上的 'Examples' 来访问。因此我没有post这里的任何源代码。
任何有助于理解此异常原因的指导或帮助以及修复它的可能解决方案将不胜感激。
自己找到问题原因和解决方法。问题的根源在modelmenu.cpp.
显然,每次调用该方法时,ModelMenu::createMenu
方法都会将 QMenu::triggered
和 QMenu::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);
已解决问题。就把它留在这里希望这对将来的人有所帮助。