Qt 5的信號與槽機制(Signal & Slot)

簡介

信號與槽機制(Signal & Slot)是Qt的一個核心特徵並且也是Qt與其它工具包的最不相同的部分,因爲有了信號與槽的編程機制,在 Qt 中處理界面各個組件的交互操作時變得更加直觀和簡單。

信號(Signal)

信號(Signal)就是在特定情況下被髮射的事件,當對象的內部狀態發生改變,信號就被髮射,在某些方面對於對象代理或者所有者也許是很有趣的。只有定義了一個信號的類和它的子類才能發射這個信號。

槽(Slot)

槽(Slot)就是對信號響應的函數,當一個和槽連接的信號被髮射的時候,這個槽被調用。槽也是普通的C++函數並且可以像它們一樣被調用;它們唯一的特點就是它們可以被信號連接。槽的參數不能含有默認值,並且和信號一樣,爲了槽的參數而使用自己特定的類型是很不明智的。

槽的訪問權限

因爲槽就是普通成員函數,但卻有一點非常有意思的東西,它們也和普通成員函數一樣有訪問權限。一個槽的訪問權限決定了誰可以和它相連:

  •  public slots:區包含了任何信號都可以相連的槽。這對於組件編程來說非常有用:你生成了許多對象,它們互相併不知道,把它們的信號和槽連接起來,這樣信息就可以正確地傳遞,並且就像一個鐵路模型,把它打開然後讓它跑起來。
  •  protected slots:區包含了之後這個類和它的子類的信號才能連接的槽。這就是說這些槽只是類的實現的一部分,而不是它和外界的接口。
  •  private slots:區包含了之後這個類本身的信號可以連接的槽。這就是說它和這個類是非常緊密的,甚至它的子類都沒有獲得連接權利這樣的信任。

示例

說明

本示例主要演示信號和槽的機制,我們使用一個單行輸入控件LineEdit,發送輸入改變信號textChange連接到槽,實現在textBrowser控件上實時顯示輸入的內容。

創建項目

創建一個Qt的Widgets Application應用,在窗體上添加一個LineEdit和一個TextBrowser(設置了一下樣式,背景黑色,字體藍色),按照下圖設計。

QT信號和槽示例

添加槽定義

修改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;
}

運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章