深入理解Qt信號槽機制
1. 信號和槽概述
信號槽是 Qt 框架引以為豪的機制之一。所謂信號槽,實際就是觀察者模式(發佈-訂閱模式)。當某個`事件`發生之後,比如,按鈕檢測到自己被點擊瞭一下,它就會發出一個信號(signal)。這種發出是沒有目的的,類似廣播。如果有對象對這個信號感興趣,它就會使用連接(connect)函數,意思是,將想要處理的信號和自己的一個函數(稱為槽(slot))綁定來處理這個信號。也就是說,當信號發出時,被連接的槽函數會自動被回調。這就類似觀察者模式:當發生瞭感興趣的事件,某一個操作就會被自動觸發。
1.1 信號的本質
信號是由於用戶對窗口或控件進行瞭某些操作,導致窗口或控件產生瞭某個特定事件,這時候Qt對應的窗口類會發出某個信號,以此對用戶的挑選做出反應。
因此根據上述的描述我們得到一個結論:信號的本質就是事件,比如:
- 按鈕單擊、雙擊
- 窗口刷新
- 鼠標移動、鼠標按下、鼠標釋放
- 鍵盤輸入
那麼在Qt中信號是通過什麼形式呈現給使用者的呢?
- 我們對哪個窗口進行操作, 哪個窗口就可以捕捉到這些被觸發的事件。
- 對於使用者來說觸發瞭一個事件我們就可以得到Qt框架給我們發出的某個特定信號。
- 信號的呈現形式就是函數, 也就是說某個事件產生瞭, Qt框架就會調用某個對應的信號函數, 通知使用者。
在QT中信號的發出者是某個實例化的類對象,對象內部可以進行相關事件的檢測。
1.2 槽的本質
在Qt中槽函數是一類特殊的功能的函數
,在編碼過程中也可以作為類的普通成員函數來使用
。之所以稱之為槽函數是因為它們還有一個職責就是對Qt框架中產生的信號進行處理。
舉個簡單的例子:
女朋友說:“我肚子餓瞭!”,於是我帶她去吃飯。
上邊例子中相當於女朋友發出瞭一個信號, 我收到瞭信號並其將其處理掉瞭。
- 女朋友 -> 發送信號的對象, 信號內容: 我餓瞭
- 我 -> 接收信號的對象並且處理掉瞭這個信號, 處理動作: 帶她去吃飯
在Qt中槽函數的所有者也是某個類的實例對象。
1.3 信號和槽的關系
在Qt中信號和槽函數都是獨立的個體,本身沒有任何聯系,但是由於某種特性需求我們可以將二者連接到一起,相當於一個綁定,在Qt中我們需要使用QOjbect類
中的connect
函數進二者的關聯。
QMetaObject::Connection QObject::connect( const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection); - 參數: - sender: 發出信號的對象 - signal: 屬於sender對象, 信號是一個函數, 這個參數的類型是函數指針, 信號函數地址 - receiver: 信號接收者 - method: 屬於receiver對象, 當檢測到sender發出瞭signal信號, receiver對象調用method方法,信號發出之後的處理動作 // connect函數相對於做瞭信號處理動作的註冊 // 調用conenct函數的sender對象的信號並沒有產生, 因此receiver對象的method也不會被調用 // method槽函數本質是一個回調函數, 調用的時機是信號產生之後, 調用是Qt框架來執行的 // connect中的sender和recever兩個指針必須被實例化瞭, 否則conenct不會成功 connect(const QObject *sender, &QObject::signal, const QObject *receiver, &QObject::method);
1.4 通過實例加深理解
現在要實現一個簡單的功能,就說創建一個按鈕,點擊這個按鈕關閉窗口
然後思考,這個功能的信號發出者,信號接受者,以及發出什麼信號,接受信號後怎麼做
- 按鈕: 信號發出者 ->
QPushButton
- 窗口: 信號的接收者和處理者 ->
QWidget
- 發出信號:被點擊 -> clicked
- 槽函數,即如何處理 -> close
現在我們來實現一下
在ui中添加一個button,取名為closeBtn
然後再Mainwindow.cpp 文件中
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close); } MainWindow::~MainWindow() { delete ui; }
註意這條語句
connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
通過這條語句來實現綁定
現在我們來運行一下
點擊按鈕,窗口關閉
到此這篇關於深入理解Qt信號槽機制的文章就介紹到這瞭,更多相關Qt信號槽機制內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!