信號與槽機制是一個非常強大的事件通信機制,是 Qt 最核心的機制之一,初學者掌握它之后,幾乎可以做任何交互操作。
信號(Signal) 是一種“事件”或“通知”,比如按鈕被點擊、文本改變、窗口關閉等。
槽(Slot) 是一個“處理函數”,用于響應信號。
當信號發生時,自動調用連接的槽函數,實現邏輯響應。
簡單的信號與槽構建示例
+-構建
如果你的欄布局與主包一樣,如下
在黑框右鍵,點擊“重置為默認布局”,就能出現如下“+”“-”號
點擊“+”號,雙擊(<發送者>等)輸入內容,示例為點擊打開按鈕,就關閉窗口?
點擊要刪除的命令,再點擊“-”號就能刪除
Edit Signals塊
我覺得使用相對麻煩,就不詳細介紹了,大家可以不學這種。
?點擊符號后,將鼠標放在對象上會變紅,點擊要選擇的信號發送者
點擊后會由對象伸出一條紅色的單項箭頭,點擊要選擇的接收者,選擇發送者發出的信號和接收者的響應操作
點擊左邊的Edit Widgets退出編輯操作
代碼方式實現
ui+代碼
右鍵按鈕,點擊“轉到槽”
選擇信號,點擊“OK”
就跳轉到了widget.cpp文件,會自動生成相關槽函數,.h文件也會增添相應聲明
我們可以在槽函數里輸出一句話(記得在.h文件增添頭文件<iostream>),保存
點擊“打開”按鈕后出現如下輸出
QObject::connect函數
在構造函數中進行信號與槽的綁定
打開widget.cpp,輸入如下連接代碼
QObject::connect(發送者,SIGNAL(檢測信號),接收者,SLOT(超函數));
this代表這個窗口 ,SLOT()超函數需在頭文件聲明
函數實現
聲明后右鍵函數,點擊“Refactor”,點擊“在widget.cpp中添加定義”
在跳轉后的widget.cpp中的生成函數中輸入如下代碼
點擊“關閉”按鈕后,輸出如下
?lambda表達式
也可以直接寫lambda表達式,就不用聲明函數了(是匿名函數),接收者this要不需要寫,默認為窗體本身
點擊“保存”鍵后輸出如下
?使用函數指針
與使用connect函數構建相似,不再贅述,給出widget.cpp文件中的代碼
QObject::connect(ui->Bclose,&QPushButton::clicked,this,&widget::on_fortch_clicked);
自定義信號與槽
先在.h頭文件聲明信號,聲明槽(紅杠處為添加部分)?
在.cpp文件中實現槽函數
QDebug輸出
QDebug是Qt中用于輸出調試信息的類,提供了一種方便的方式來輸出文本到標準輸出,返回一個QDebug對象,使用流操作符<<輸出各種數據類型,與cout使用類似
需在.h中引入<QDebug>頭文件
在.cpp的構造函數中連接信號與槽(connect前面可以聲明QObject也可以不寫,因為Widget是QObject的派生類,可使用基函數的成員函數)
再使用emit關鍵字觸發信號,輸出如下
帶參數
.cpp代碼如下
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,SIGNAL(mysignal(int)),this,SLOT(myslot(int)));emit mysignal(100);
}Widget::~Widget()
{delete ui;
}void Widget::myslot(int value)
{qDebug()<<"myslot";qDebug()<<value;
}
運行結果如下
雖然我們約定信號與槽的形參要一樣,但是參數不一樣在Qt中其實也允許發生?