简介
信号与槽机制(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;
}