2016-01-19 85 views
0

我當時正在玩Qt演示瀏覽器示例here,並且當我嘗試對書籤處理代碼進行小改動時發現了異常。QMenu激活多次

我的意圖是讓工具欄中的書籤在新選項卡中打開,而不是在現有選項卡中打開。它適用於直接位於書籤選項卡上的書籤。但是文件夾內的書籤是那些行爲怪異的書籤。

我在bookmarks.cpp中修改了BookmarksToolBar::activatedSLOT以在新選項卡而不是現有選項卡中打開網址。那時我注意到SLOT被多次調用,計數等於菜單渲染的次數。即第一次激活菜單項時,SLOT被調用一次,下一次激活項時,SLOT被調用兩次,以此類推。

我認爲必須有多個信號插槽連接,因此我檢查了BookmarksToolBar::build()方法,其中信號插槽連接完成,並發現控制流只進入一次方法。我發現很難弄清楚SLOT多次被調用。

該項目的問題是Qt附帶的示例項目「Tab瀏覽器」,可通過點擊Qt-Creator歡迎屏幕上的'Examples'來訪問。因此我沒有在這裏發佈任何源代碼。

任何指導或幫助理解這種異常的原因和可能的解決方案來解決它將不勝感激。

回答

1

我自己發現問題的原因和解決方案。問題的根源在modelmenu.cpp

顯然,ModelMenu::createMenu方法在每次調用該方法時都會將信號連接到SLOTQMenu::triggeredQMenu::hovered。 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); 

解決了這一問題。只是在這裏留下希望這將有助於未來的人。

+1

Qt的UniqueConnection連接類型正是這種情況 - http://doc.qt.io/qt-4.8/qt.html#ConnectionType-enum – Shf

+0

@Shf:對我來說太愚蠢了。我不介意設置連接類型。謝謝。 – nnb