信号与槽
connect函数实现(少用)
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot())); // SIGNAL和SLOT是宏,用于将参数转化为相应的字符串,继承QObject的子类可以省略命名空间QObject::一个信号可以连接多个槽函数
多个信号可以连接同一个槽函数
一个信号可以连接另一个信号
connect静态函数实现
QMetaObject::Connection QObject::connect(sender, &signal, receiver, &method, Qt::connectionType = Qt::AutoConnection)); sender和receiver都是对象指针
signal是信号函数,只有声明不需要定义实现,在sender对应的类的signals:中定义。
method是槽函数,需要在receiver的.h文件中声明public slots:或private slots:并且在cpp中定义实现。
Qt::connectionType可选参数,表示信号与槽之间的关联方式:
Qt::AutoConnection默认值,自动确定关联方式
Qt::DirectConnection信号发射时,槽立即执行,槽函数与信号在同一线程
Qt::QueuedConnection事件循环回到接收者线程后执行槽,槽与信号不在同一线程
Qt::BlockingQueueConnection与Qt::QueuedConnection相似,信号线程阻塞直到槽执行完毕。信号与槽不能在同一线程,否则会死锁
信号和槽函数带参:
signals:
connect(ui->sender, &QCheckBox::clicked, this, qOverload<bool>(&Widget::method)); // qOverload<参数>
private slots:
void QCheckBox::clicked(bool checked = false); // QCheckBox有选中和未选中两种状态,分别对应checked的true和falseconnect成员函数实现
待补充
disconnect函数
解除一个sender的所有signal连接
disconnect(myObject, nullptr, nullptr, nullptr); // 静态函数 myObject->disconnect(); // 成员函数解除一个sender的特定signal的所有连接
disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr); // 静态函数 myObject->disconnect(SIGNAL(mySignal())); // 成员函数解除与一个receiver的所有连接
disconnect(myObject, nullptr, myReceiver, nullptr); // 静态函数 myObject->disconnect(myReceiver); // 成员函数解除一堆特定的信号和槽的连接
disconnect(ui->sender, &QCheckBox::clicked, this, &Widget::method);
sender()函数
槽函数里使用QObject::sender()获取信号发送者的指针
QCheckBox * b = qobject_cast<QCheckBox *>(sender()); // qobject_cast强制类型转换,将sender()的返回转换为QCheckBox *类型发送信号emit
QString name = "zhang";
int age = 999;
emit func(name, age);信号函数不能有返回值,可以带参