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