Qt學習筆記2

2022-09-18 20:54:15 字數 2663 閱讀 8744

訊號和槽機制屬於qt的特色機制,他提供了不同控制項之間通訊功能,每個控制項都包含了預定義的訊號和槽,我們也可以自己為類定義訊號和槽,當乙個類被繼承的時候他的訊號和槽也同樣會被繼承,乙個類如果支援訊號和槽他必須繼承自qobject

比如我們想實現button和mainwindow之間的通訊,當按鈕被點選時mainwindow會被關閉

分析上面的案例,當點選button的動作發生時button向mainwindow傳送訊號,mainwindow接受訊號並執行關閉(槽)

常見的訊號與槽的鏈結方式如下:

connect(object1,signal(signal),object2,slot(slot))

//訊號傳送者,傳送的訊號(函式位址),訊號接受者,接受和處理訊號

我們開啟幫助文件去看qpushbutton的預定義訊號

它本身並沒有什麼訊號其訊號主要繼承父類的,我們點開qabstractbutton

四個訊號分別對應著點選,按壓,釋放,切換(與狀態有關)

再看看mainwindow都有哪些槽

connect(button,&pushbutton::clicked,mainwindow,&mainwindow::close);
要注意需要關聯的訊號和槽的簽名必須是等同的,即訊號的引數型別和引數個數與槽的引數型別和引數個數相同

但是特殊情況下訊號的引數可以多於槽的引數,但必須是最後幾個引數,注意雖然數量上可以少但是型別必須一致即簽名相同

訊號與槽具有鬆散耦合的特點,即槽不知道哪些訊號關聯了自己,他只需要再有訊號接受的時候進行相應就可以了,這樣當被關聯的物件再執行的時候被刪除時,應用程式也不會崩潰

不過明顯通過訊號來呼叫槽的方法要比直接呼叫的方法要損失很多效能,不過再大多數情況下這種效能損失是值得的

class mypushbutton : public

qpushbutton

;

上面是自定義訊號和槽的方法 ,下面我們看乙個具體的案例,類repository會向類productor傳送訊號isempty表示容量未滿請求產生乙個產品,

class repository : publicqwidget

;

class productor : public qwidget
};

然後再主程式中新增如下**

connect(rep1,&repository::isempty,pro1,&productor);//鏈結函式

emit rep1->isempy();//觸發訊號

當訊號發生過載的時候,要指明具體是哪乙個比如過載isempty()方法,使其指明需要哪種貨物,並過載product()方法使其生產固定的產品

void

isempty(qstring name);

void

product(qstring name)

同時在鏈結的時候每乙個都要指明是哪乙個訊號,因為訊號和對應槽的簽名必須相同

void(repository::*repositorysignal)(qstring)=&repository::isempty();

//宣告函式指標

void(productor::*productsignal)(qstring)=&productor::product();

//宣告函式指標,注意由於product是成員函式所以必須帶網域名稱

connect(rep1,

repositorysignal,pro1,

productsignal);

//進行鏈結

對於qt4及以前的版本可以使用

connnect(object1,signal(signal),object2,slot(slot)));
的寫法但是不推薦,因為並不會檢測引數

1.訊號可以觸發其他訊號

connect(object1,signal(signal1),object2,signal(signal1));
2.同乙個訊號可以與多個槽相連

connect(object1,signal(signal2),object2,signal(slot2));

connect(object1,signal(signal2),object3,signal(slot1));

3.同乙個槽可以相應同乙個訊號

connect(object1,signal(signal2),object2,signal(slot2));

connect(object3,signal(signal2),object2,signal(slot2));

有的時候系統預定義的槽可能含有引數這是可以用lambda表示式的方法對槽進行一定的封裝

disconnnect(object1,signal(signal),object2,slot(slot)));

QT學習筆記(2) 訊號與槽

1 moc 元物件 系統簡介 在 qt 助手的索引裡面輸入 the meta object system 就可以看到元物件系統的英文文件。現在將其主要的內容描述如下 qt 元物件系統實現了物件之間通訊機制 訊號和槽,並提供了執行時型別資訊和動態屬性系統。元物件系統是 qt 類庫獨有的功能,是 qt ...

Qt學習筆記

1.參考資料 1 2 3 4 5 6 2.faq 2.1.qt creator 2.1.1.xp下用qt creator編譯自帶例子mdi sdi 當不勾選projects build settings build environment的 clear system environment 時,編譯...

QT學習筆記

1.在windows下配置好qt的環境變數以後,用cmd開始編譯,qmake project qmake hello.pro mingw32 make 結果出現錯誤 include 問題已經解決了,主要是 故而只需在.pro檔案中加入 greaterthan qt major version,4 q...