簡介
信號與槽機制(Signal & Slot)是Qt的一個核心特徵並且也是Qt與其它工具包的最不相同的部分,因爲有了信號與槽的編程機制,在 Qt 中處理界面各個組件的交互操作時變得更加直觀和簡單。
信號(Signal)
信號(Signal)就是在特定情況下被髮射的事件,當對象的內部狀態發生改變,信號就被髮射,在某些方面對於對象代理或者所有者也許是很有趣的。只有定義了一個信號的類和它的子類才能發射這個信號。
槽(Slot)
槽(Slot)就是對信號響應的函數,當一個和槽連接的信號被髮射的時候,這個槽被調用。槽也是普通的C++函數並且可以像它們一樣被調用;它們唯一的特點就是它們可以被信號連接。槽的參數不能含有默認值,並且和信號一樣,爲了槽的參數而使用自己特定的類型是很不明智的。
槽的訪問權限
因爲槽就是普通成員函數,但卻有一點非常有意思的東西,它們也和普通成員函數一樣有訪問權限。一個槽的訪問權限決定了誰可以和它相連:
- public slots:區包含了任何信號都可以相連的槽。這對於組件編程來說非常有用:你生成了許多對象,它們互相併不知道,把它們的信號和槽連接起來,這樣信息就可以正確地傳遞,並且就像一個鐵路模型,把它打開然後讓它跑起來。
- protected slots:區包含了之後這個類和它的子類的信號才能連接的槽。這就是說這些槽只是類的實現的一部分,而不是它和外界的接口。
- private slots:區包含了之後這個類本身的信號可以連接的槽。這就是說它和這個類是非常緊密的,甚至它的子類都沒有獲得連接權利這樣的信任。
示例
說明
本示例主要演示信號和槽的機制,我們使用一個單行輸入控件LineEdit,發送輸入改變信號textChange連接到槽,實現在textBrowser控件上實時顯示輸入的內容。
創建項目
創建一個Qt的Widgets Application應用,在窗體上添加一個LineEdit和一個TextBrowser(設置了一下樣式,背景黑色,字體藍色),按照下圖設計。
添加槽定義
修改mainwindow.h頭文件,添加一個私有的槽
private slots:
void do_something(); //添加一個文本改變的槽
連接信號和槽
修改mainwindow.cpp實現在頭文件中聲明的槽
//槽函數實現
void MainWindow::do_something(const QString &txt)
{
qDebug() << "輸入" << txt;
ui->textBrowser->setText(txt);
}
然後在構造函數中連接LineEdit控件的textChanged信號與我們編寫的槽,當發送文本改變信號的時候,執行do_something槽函數。
//連接信號和槽
connect(ui->lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(do_something(const QString &)));
其中textChanged信號是控件內部定義的信號,可以查看API得到。
完整代碼如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//連接信號和槽
connect(ui->lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(do_something(const QString &)));
}
//槽函數實現
void MainWindow::do_something(const QString &txt)
{
qDebug() << "輸入" << txt;
ui->textBrowser->setText(txt);
}
MainWindow::~MainWindow()
{
delete ui;
}