QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
sender: 信号发送者
signal: 信号
receiver: 信号接收者
mrthod: 槽函数
type: 连接类型
signals:
// 未带参数
void signal_doSomething1();
// 带参数
void signal_doSomething2(int value);
// 带自定义参数
void signal_doSomething3(const Person &person);
public slots:
void slot_doSomething1();
void slot_doSomething2(int value);
void slot_doSomething3(const Person &person);
// QT4写法
connect(this, SIGNAL(signal_doSomething1()), this, SLOT(slot_doSomething1()));
connect(this, SIGNAL(signal_doSomething2(int)), this, SLOT(slot_doSomething2(int)));
connect(this, SIGNAL(signal_doSomething3(const Person &)), this, SLOT(slot_doSomething3(const Person &)));
// QT5写法
connect(this, &Widget::signal_doSomething1, this, &Widget::slot_doSomething1);
connect(this, &Widget::signal_doSomething2, this, &Widget::slot_doSomething2);
connect(this, &Widget::signal_doSomething3, this, &Widget::slot_doSomething3);
// 使用lambda表达式
connect(this, &Widget::signal_doSomething1, this, [=] {
slot_doSomething1();
});
connect(this, &Widget::signal_doSomething2, this, [=](int value) {
slot_doSomething2(value);
});
注意点
// 在使用lambda表达式来写槽函数的情况下 // 如果指定了接收者对象,则槽函数是在接收者所在的线程执行的 connect(this, &Widget::signal_doSomething1, this, [=] { slot_doSomething1(); }); // 如果没有指定接收者对象,则槽函数是在发送者所在的线程执行的 connect(this, &Widget::signal_doSomething1, [=] { slot_doSomething1(); });
#include
qRegisterMetaType("Person");
signals:
// 信号重载
void signal_doWork();
void signal_doWork(int value);
public slots:
// 槽函数重载
void slot_doWork();
void slot_doWork(int value);
// 信号槽连接
// QT4写法
connect(this, SIGNAL(signal_doWork()), this, SLOT(slot_doWork()));
connect(this, SIGNAL(signal_doWork(int)), this, SLOT(slot_doWork(int)));
// QT5写法
connect(this, QOverload<>::of(&Widget::signal_doWork), this, QOverload<>::of(&Widget::slot_doWork));
connect(this, QOverload::of(&Widget::signal_doWork), this, QOverload::of(&Widget::slot_doWork));
类型 | 描述 |
---|---|
Qt::AutoConnection | (默认值)如果接收者位于发出信号的线程中,则使用Qt::DirectConnection。否则,使用Qt::QueuedConnection。在发出信号时确定连接类型。 |
Qt::DirectConnection | 当信号发出时,槽函数将立即被调用。槽在信号线程中执行。 |
Qt::QueuedConnection | 当控制返回到接收线程的事件循环时,将调用槽。槽在接收者的线程中执行。 |
Qt::BlockingQueuedConnection | 与Qt::QueuedConnection相同,不同的是信号线程阻塞直到槽返回。如果接收方位于发出信号的线程中,则不能使用此连接,否则应用程序将死锁。 |
Qt::UniqueConnection | 这是一个可以使用位或与上面任何一种连接类型组合的标志。当Qt::UniqueConnection被设置时,如果连接已经存在,QObject::connect()将会失败(例如,如果相同的信号已经连接到同一对对象的同一槽函数)。该标志是在Qt 4.6中引入的。 |
解除具体的一个信号与槽之间的连接
QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
阻塞一对象发出的所有信号
QObject::blockSignals(bool block)