1.直接连接
使用Qt::DirectionConnection,槽函数会直接在发射信号的线程中执行,没有切换线程的过程。这是默认的连接方式。
// 1.直接连接
connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()), Qt::DirectConnection);
2.自动连接
使用Qt::AutoConnection,系统会根据发射信号的线程和接收槽函数的线程自动选择合适的连接方式。如果信号和槽函数在同一线程中,采用直接连接,否则采用队列连接。
// 2.自动连接
connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()), Qt::AutoConnection);
3.队列连接
使用Qt::QueuedConnection(),槽函数的执行会放入接收对象的事件队列中,由接收对象所在线程的事件循环处理。
// 3.队列连接
connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()), Qt::QueuedConnection);
4.连接到Lambda表达式
使用Lambda表达式作为槽函数,可以在信号发射时执行一段匿名的代码。
// 4.连接到Lambda表达式
connect(sender, SIGNAL(mySignal()), [=](){
// 函数体
});
关于匿名函数的讲解可参考此博客:C++ Lambda表达式详解
5.连接到全局函数
可以将全局函数作为槽函数连接到信号。
// 5.连接到全局函数
connect(sender, SIGNAL(mySignal()), myGlobalFunction);
6.连接到静态成员函数
可以将静态成员函数作为槽函数连接到信号。
// 6.连接到静态成员函数
connect(sender, SIGNAL(mySignal), MyClass::myStaticFunction);
7.连接到带参数的槽函数
如果信号和槽函数的参数不匹配,可以使用QOverload宏来连接带参数的槽函数。
// 7.连接到参数的槽函数
connect(sender, SIGNAL(mySignal(int)), receiver, QOverload<int>::of(&MyClass::mySlot));