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

运行结果

在这里插入图片描述

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