connect的函数原型为:
QMetaObject::ConnectionQObject::connect(constQObject*sender,
constchar*signal,
constQObject*receiver,
constchar*method,
Qt::ConnectionTypetype=Qt::AutoConnection);
最后一个参数决定,这个信号槽是直接连接还是队列连接,默认值是Qt::AutoConnection
对于Qt::AutoConnection的情况:
1、sender和receiver依附线程是同一个,就是直接连接
2、sender和receiver依附线程不是同一个,就是队列连接
依附线程可以理解为:在哪个线程new的就依附哪个线程,eg:
A*a=newA;//a的依附线程为thread1
QThread*thread2=newQThread;
a->moveToThread(thread2);//a的依附线程变为thread2
直接连接:类似直接调用函数(立即执行)
队列连接:将信号放在一个队列中,等receiver有空了开始执行
connect(nBtn,
&myPushButton::mys,
nBtn,
&myPushButton::response);
是直接连接,myPushButton::mys信号发射时,会立即执行myPushButton::response
connect(nBtn,
&myPushButton::mys,
this,
&MainWindow::close);
也是直接连接,myPushButton::mys信号发射时,也会立即执行MainWindow::close
但是在MainWindow::close中,不是直接就关闭这个窗口,而是向MainWindow发送一个QCloseEvent的事件
QCloseEvent会在事件循环中分发给MainWindow,在事件分发中可以对事件进行过滤(这些都是后话了)
QApplicationa(argc,argv);
...
//开始事件循环
//在事件循环前调用close无效
a.exec();
|