Appearance
QT 信号与槽
- 实际上就是一种观察者模式的实现
- 组件之间的通信
- 信号不用定义,只须在组件中声明
- 信号放在类的
signals:权限下面 - 信号触发使用
emit关键字 - 信号触发可以传入数据,在对应的槽函数中接收,槽函数的声明需要中需要带上对应的数据,例如
emit call(foo); - 信号与槽的连接一般格式是
(发送者,发送者的信号,接收者,接收者的槽函数),具体几种类型看下面 - 槽函数如果在外部使用,需要放在
public slots:权限下;只是内部使用,比如处理组件内按钮点击信号的槽函数,只须放在private slots:权限下。
信号与槽的连接
1> 使用 UI 界面信号与槽工具栏进行连接,这种方法只能连接系统提供的信号函数和槽函数

2> 通过组件右键菜单中的转到槽,跳转对应槽函数,仅限于系统系统提供的信号函数,但槽函数可自己实现,连接过程由系统实现

3> QT4 版本手动连接信号与槽 (connect)
cpp
/*static*/ QMateObject::Connection
QObject::connect(
const QObject *sender, // 信号发射者
const char *signal, // 发射的信号, 信号函数名本质上是函数指针,
// 此处需要使用 SIGNAL()
const QObject *receiver, // 信号的接收者
const char *method, // 接收后处理的槽函数
Qt::ConnectionType type = Qt::AutoConnection
)cpp
connect(ui->btn3, SIGNAL(clicked()), this, SLOT(my_slot()));4> QT5 版本的连接
- QMetaObject::connection()
cpp
[static] QMetaObject::Connection //返回一个连接,是静态成员函数
QObject::connect( //函数名
const QObject *sender, //信号发射者
PointerToMemberFunction signal, //信号函数的地址
const QObject *receiver, //信号接受者
PointerToMemberFunction method) //槽函数的地址cpp
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);5> C++11 后的新连接,将信号连接到仿函数(Lambda表达式作为槽函数)中
cpp
[static] QMetaObject::Connection //返回值类型 是一个静态成员函数
QObject::connect( //函数名
const QObject *sender, //信号发射者
PointerToMemberFunction signal, //发射的信号
Functor functor) //接受信号后处理的函数cpp
QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
socket->write("GET " + page + "\r\n");
});