Qt5 UI訊號 槽自動連線的控制項重名

2021-09-07 15:43:19 字數 908 閱讀 5734

**

對qt5稍有熟悉的童鞋都知道訊號、槽的自動連線機制。該機制使得qt designer 設計的ui中包含的控制項,可以不通過顯式connect,直接和cpp中的相應槽相關聯。該機制的詳細文章見 

簡而言之,ui中的乙個object name, 可以直接與code中的槽

void on__();

對應,這樣,在利用designer 做ui的時候,就可以很方便地完成訊號槽連線,無需新增任何**。

然而,這種機制存在乙個隱患,即控制項重名。雖然designer 在開發乙個ui檔案時,會自動為同類控制項的不同例項計數,然而,當乙個 ui 作為widget嵌入另乙個主視窗時,卻不會檢查控制項重名。

舉例而言,假設乙個日期控制項widget上有個按鈕叫「同步」(pushbutton_syn),然後,整個日期控制項作為乙個widget,嵌入到主視窗(dialog)裡。恰好,主視窗中有乙個按鈕,也叫 pushbutton_syn,好了,問題出現。在主視窗構造時,呼叫 setupui() 建立各個按鈕以及控制項,而後呼叫自動連線**:

qmetaobject::connectslotsbyname(mydialog);
該**會根據目前.h中定義的符合on_objname_slot 格式的槽,到介面元素裡查詢對應控制項。是與主視窗的pushbutton_syn關聯,還是與日期控制項中的pushbutton_syn關聯,完全取決於二者的建立順序,是不靠譜的。 

為了避免這個情況,建議: 

1、對可重用的含有複雜子介面的widget,設計時全部使用難以發生碰撞的名字規則,比如,

pushbutton_myctrl_syn
2、建議對很複雜的控制項,不要在 designer 裡做提公升,而是等到程式啟動後,再動態建立,可以避免很多問題。

Qt訊號與槽的自動關聯

作者 汪應豪 sky hawk2010 yahoo.cn 為了實現槽函式自動進行關聯,對於qt視窗部件已經提供的訊號,可按照以下規範命名 void on 視窗部件名稱 訊號名稱 訊號引數 具體做法如下 1.在exampleclass類的標頭檔案 h 中的私有槽函式下新增如下 private slot...

QT訊號槽的跨執行緒連線

qt中的執行緒可以通過繼承qthread類,重寫run 函式,run 函式即新執行緒的入 通過start 函式啟動新執行緒 我我們實現的這個qthread的派生類,只不過是用來管理執行緒的。run 函式返回,新執行緒結束,可以在呼叫 exec 函式,在新執行緒中也開啟時間迴圈。繼承自qobject的...

QT訊號與槽的連線方式

一.qt autoconnection qt autoconnection表示系統自動選擇相應的連線方式,如果訊號與槽在同一執行緒,就採用qt directconnection,如果訊號與槽不在同一執行緒,將採用qt queuedconnection的連線方式。二.qt directconnecti...