QT不同线程间signal-slot机制的值传递
signal-slot机制是QT核心,也是QT解决线程之间通信的一大亮点。深刻理解其两大特性:
(1)loosely coupled
sender与receiver互不关心,一个signal可以被多个slot获取,signal可以触发另一个signal。
(2)type-safe
connect连接时,遵守严格的参数约定,slot参数必须与signal参数保持一致,slot参数数量可以少于signal。
现在code看看究竟。测试方法:
创建两个dialog窗口:dialog和subdialog。subdialog窗口通过dialog窗口的一个QPushbutton调出。
subdialog窗口上的一个QPushbutton emit 一个信号:
signal_subdialog(num1, num2);
提前赋值:
void subdialog::slot1()
{
num1 = 1;
num2 = 2;
emit signal_subdialog(num1, num2);
qDebug("signal emit");
}
主窗口设置一个QLineEdite控件来接收显示从信号接收的数据。
connect(dialog1, SIGNAL(signal_subdialog(int, int)), this, SLOT(slot_receive(int, int)));
测试顺利通过。
总结:
- signal 在sender的class里声明,没有定义,声明时带上形参,只是形参而已,起到类型声明的作用。
- slot在receiver的class里声明并定义,一般为public slots,也要带上形参,个数不超过signal形参个数。
- 将sender class 声明为receiver class的数据成员(一般为private)。
- 在receiver class的对象中 connect,保持signal和slot的参数类型一致。只写类型,不带形参名。
- slot定义时形参就是从signal接收来的数据。
void Dialog::slot_receive(int tmp1, int tmp2)
{
shownumber1 = tmp1;
shownumber2 = tmp2;
qDebug()<<shownumber1<<shownumber2;
line->setText(QString("receive number is %1 and %2").arg(shownumber1).arg(shownumber2));
}
完整代码: