上一節我們詳細分析了connect()
函式。使用connect()
可以讓我們連線系統提供的訊號和槽。但是,qt 的訊號槽機制並不僅僅是使用系統提供的那部分,還會允許我們自己設計自己的訊號和槽。這也是 qt 框架的設計思路之一,用於我們設計解耦的程式。本節將講解如何在自己的程式中自定義訊號槽。
訊號槽不是 gui 模組提供的,而是 qt 核心特性之一。因此,我們可以在普通的控制台程式使用訊號槽。
經典的觀察者模式在講解舉例的時候通常會舉報紙和訂閱者的例子。有乙個報紙類news*****
,有乙個訂閱者類subscriber
。subscriber
可以訂閱news*****
。這樣,當news*****
有了新的內容的時候,subscriber
可以立即得到通知。在這個例子中,觀察者是subscriber
,被觀察者是news*****
。在經典的實現**中,觀察者會將自身註冊到被觀察者的乙個容器中(比如subscriber.registerto(news*****)
)。被觀察者發生了任何變化的時候,會主動遍歷這個容器,依次通知各個觀察者(news*****.notifyallsubscribers()
)。
下面我們看看使用 qt 的訊號槽,如何實現上述觀察者模式。注意,這裡我們僅僅是使用這個案例,我們的**並不是去實現乙個經典的觀察者模式。也就是說,我們使用 qt 的訊號槽機制來獲得同樣的效果。
news*****.h
#ifndef news*****_h
#define news*****_h
#includeclass news*****: public qobject
void send()
signals:
void new*****(qstring &name);
private:
qstring m_name;
};#endif // news*****_h
#ifndef reader_h
#define reader_h
#include #include class reader : public qobject
void receive(const qstring & name)
};#endif // reader_h
#include "mainwindow.h"
執行結果: C 資訊槽 訊號槽
訊號槽作用 1 可以將事件源和訂閱處理者分開 2 降低耦合性,事件源只需要向外界暴露最少的資訊,內部改變不影響外部行為 3.降低 複雜性,將事件不同的處理 分散到各個訂閱者內部。使用資訊槽 1 包含標頭檔案,include sigslot.h using namespace sigslot 2 在事...
訊號槽系統
訊號槽 乙個物件 sender 上由於某件事情的發生而廣播乙個訊號 signal 通過connect函式進行連線,另乙個物件 receiver 可以接收這個訊號並呼叫乙個槽函式 slot 作為響應。connect函式的基本形式 qobjectconnect sender,signal,receive...
QT學習筆記(2) 訊號與槽
1 moc 元物件 系統簡介 在 qt 助手的索引裡面輸入 the meta object system 就可以看到元物件系統的英文文件。現在將其主要的內容描述如下 qt 元物件系統實現了物件之間通訊機制 訊號和槽,並提供了執行時型別資訊和動態屬性系統。元物件系統是 qt 類庫獨有的功能,是 qt ...