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和false

connect成员函数实现

待补充

disconnect函数

  1. 解除一个sender的所有signal连接

    disconnect(myObject, nullptr, nullptr, nullptr); // 静态函数
    myObject->disconnect(); // 成员函数
  2. 解除一个sender的特定signal的所有连接

    disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr); // 静态函数
    myObject->disconnect(SIGNAL(mySignal())); // 成员函数
  3. 解除与一个receiver的所有连接

    disconnect(myObject, nullptr, myReceiver, nullptr); // 静态函数
    myObject->disconnect(myReceiver); // 成员函数
  4. 解除一堆特定的信号和槽的连接

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

信号函数不能有返回值,可以带参

标签: none

添加新评论