QT不同线程间signal-slot机制的值传递

155 篇文章 26 订阅

QT不同线程间signal-slot机制的值传递

signal-slot机制是QT核心,也是QT解决线程之间通信的一大亮点。深刻理解其两大特性:

1loosely coupled

senderreceiver互不关心,一个signal可以被多个slot获取,signal可以触发另一个signal

2type-safe

connect连接时,遵守严格的参数约定,slot参数必须与signal参数保持一致,slot参数数量可以少于signal

现在code看看究竟。测试方法:

创建两个dialog窗口:dialogsubdialogsubdialog窗口通过dialog窗口的一个QPushbutton调出。

https://i-blog.csdnimg.cn/blog_migrate/c1033c3064ad02a4ad946657800aae62.png

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

https://i-blog.csdnimg.cn/blog_migrate/b8c16cd8089a35d5a5e086d281d2a73c.png

测试顺利通过。

总结:

  1. signal senderclass里声明,没有定义,声明时带上形参,只是形参而已,起到类型声明的作用。
  2. slotreceiverclass里声明并定义,一般为public slots,也要带上形参,个数不超过signal形参个数。
  3. sender class 声明为receiver class的数据成员(一般为private)。
  4. receiver class的对象中 connect,保持signalslot的参数类型一致。只写类型,不带形参名。
  5. 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));

}

完整代码:

http://download.csdn.net/detail/hustyangju/6778685

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值