1. 信號與槽機制
信號與槽(Signal & Slot)是Qt編程的基礎,因為信號與槽的編程機制,在Qt中處理界面各個組件的交互操作時變得更加直觀和簡單。信號是在特定情況下被發射的事件,槽就是對信號響應的函數。信號與槽關聯是用QObject::connect()函數實現的,其基本格式是:QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect()是QObject類的一個靜態函數,而QObject是所有Qt類的基類,在實際調用時可以忽略前面的限定符,所以可以直接寫為:
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
//sender:發射信號的對象
//signal():是信號名稱。信號可以看做是特殊的函數, 需要帶括號,有參數時還需要指明參數。
//receiver:接收信號的對象
//slot():槽函數的名稱,需要帶括號,有參數時還需要指明參數。
SIGNAL和SLOT是Qt的宏,用于指明信號和槽,并將它們的參數轉換為相應的字符串。也可以不使用這兩個宏,而使用雙引號代替:
connect(sender, "signal()", receiver, "slot()");
2. 信號與槽的連接方式
在使用信號與槽的類中,必須在類的定義中加入宏Q_OBJECT。當一個信號被發射時,與其關聯的槽函數會被立即執行,就像正常調用一個函數一樣。只有當信號關聯的所有槽函數執行完畢后,才會執行發射信號處后面的代碼。
一個信號連接多個槽
connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
connect(pushButton, SIGNAL(clicked()), this, SLOT(close());
多個信號連接一個槽
connect(pushButton1, SIGNAL(clicked()), this, SLOT(close()));
connect(pushButton2, SIGNAL(clicked()), this, SLOT(close()));
connect(pushButton3, SIGNAL(clicked()), this, SLOT(close()));
一個信號連接另一個信號
connect(pushButton, SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChanged(QString)));
3. 信號與槽的創建
Qt 里有大量自定義好的信號與槽, 基本夠我們使用。若沒有找到想要的信號與槽,就需要定義自己的信號和槽了
創建信號:在mianwindow.h里聲明信號即可,無需定義
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
/* 聲明一個信號,只需聲明,無需定義 */
void pushButtonTextChanged();
};
#endif
創建槽:在mianwindow.h里聲明槽,在mianwindow.cpp里實現槽的定義
/***** 在 mianwindow.h 里直接聲明槽 *****/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
classMainWindow:public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent =nullptr);
~MainWindow();
signals: //聲明一個信號,只需聲明,無需定義
voidpushButtonTextChanged();
public slots:
voidchangeButtonText();//聲明切換文本槽函數
voidpushButtonClicked();//聲明按鈕點擊槽函數
private:
QPushButton *pushButton; //聲明對象
};
#endif
/***** 在 mianwindow.cpp 里實現槽的定義 *****/
/* 實現按鈕點擊槽函數 */
void MainWindow::pushButtonClicked()
{
emit pushButtonTextChanged(); //使用emit發送信號
}
/* 實現按鈕文本改變的槽函數 */
void MainWindow::changeButtonText()
{
pushButton->setText("I was clicked!");
}
信號與槽的連接:在mainwindow.cpp中連接信號與槽
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->resize(800,480);
pushButton = new QPushButton(this);//實例化按鈕對象
pushButton->setText("I am a Button"); //設定按鈕的文本
/* 信號與槽連接 */
connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));
}
上面代碼編譯運行后如下圖示,點擊按鈕后,pushButtonClicked()槽函數被觸發運行,從而emit出pushButtonTextChanged()信號,進而觸發changeButtonText()槽函數實現文本的切換
審核編輯:湯梓紅
-
信號
+關注
關注
11文章
2738瀏覽量
76164 -
編程
+關注
關注
88文章
3519瀏覽量
93259 -
Qt
+關注
關注
1文章
300瀏覽量
37596
原文標題:Qt開發中的信號與槽機制
文章出處:【微信號:嵌入式攻城獅,微信公眾號:嵌入式攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論