[QT编程系列-15]: 基础框架 - 信号与槽,connect函数详解

目录

一、线程内不同对象的通信

1.1  connect函数介绍

1.2  connect的用法

1.3 代码示例

二、不同线程间不同对象的通信

2.1 概述

2.2 代码案例


一、线程内不同对象的通信

1.1  connect函数介绍

在使用 Qt 框架进行开发时,connect 函数是用于建立信号与槽机制的重要函数。

它用于在对象之间建立关联,使得一个对象的信号可以触发另一个对象的槽函数

即一个对象发送信号时,就可以直接调用关心此信号的另一个对象的成员函数!!!

槽函数的本质是:信号 + 回调函数,由发送信号的对象/线程,调用关心此信号的某个对象内部的成员函数(这个回调函数,给他一个专有的名字:槽函数)。

在 Qt 中,可以使用 connect 函数来连接信号和槽。

1.2  connect的用法

以下是 connect 函数的一般语法:

connect(sender, SIGNAL(senderSignal()), receiver, SLOT(receiverSlot()));

其中,

sender 是发送信号的对象 //目标槽函数与信号的关系是注册在发送对象的上下文中

senderSignal 是发送信号的函数,//特定的信号、事件、消息ID

receiver 是接收信号并执行槽函数的对象,//通过该对象名称,可以找到信号对应的目标对象的成员函数,即槽函数。

receiverSlot 是接收信号执行的槽函数。//关心某个信号的目标对象的处理函数,即当发送方发送事件时,关心该事件的接收对象的槽函数(成员)函数被调用。

1.3 代码示例

下面是一个示例,演示了如何使用 connect 函数连接一个按钮的点击信号和一个槽函数:

// 在某个类中定义槽函数
public slots:
    void onButtonClicked();

// 在另一个地方连接信号和槽
QPushButton* button = new QPushButton("Click Me");

QObject::connect(button, SIGNAL(clicked()), this, SLOT(onButtonClicked()));

在上面的示例中,当button对象点击按钮时,button按钮对象的 clicked() 信号将触发,然后知道承载button对象的当前窗体对象的 onButtonClicked() 槽函数(成员函数)。

需要注意的是,Qt 提供了几种不同的连接方式和语法,包括使用 SIGNAL 和 SLOT 宏、lambda 表达式等。具体使用哪种方式取决于你的项目和个人偏好。还可以通过使用新的语法规则,如 Qt 5 中的 connect 函数的重载版本或使用 Qt 的信号和槽的新语法来实现连接。

请参考 Qt 的官方文档以获取更多关于 connect 函数的详细信息和使用示例。

二、不同线程间不同对象的通信

2.1 概述

在 Qt 中,可以使用 connect 函数在不同线程之间建立信号与槽的连接,以实现线程间的通信。

Qt 的线程间通信是通过将信号传递给跨线程槽函数来实现的。

2.2 代码案例

以下是一个示例,演示了如何在不同线程中使用 connect 函数进行信号与槽的连接:

// 在某个类中定义槽函数
// 这个类可以是一个QObject的派生类
public slots:
    void onSignalReceived();

// 在另一线程中创建对象,并连接信号与槽
QThread* thread = new QThread;
MyObject* myObject = new MyObject;

QObject::connect(myObject, SIGNAL(mySignal()), this, SLOT(onSignalReceived()), Qt::QueuedConnection);

myObject->moveToThread(thread);

thread->start();

在上面的示例中,MyObject 类是一个派生自 QObject 的类,它具有一个名为 mySignal 的信号。我们在另一个线程中创建了 MyObject 的一个实例,并将其移动到该线程中。然后,使用 connect 函数将 mySignal 信号连接到 onSignalReceived 槽函数,并使用 Qt::QueuedConnection 参数确保信号在接收方所在的线程中执行。

需要注意的是,在跨线程通信时,Qt 提供了一些特殊的连接类型,如 Qt::QueuedConnection 和 Qt::BlockingQueuedConnection。这些连接类型可以确保信号在接收方线程的事件循环中执行。如果没有适当的连接类型,跨线程的信号传递将会是不安全的。

此外,Qt 还提供了其他一些线程间通信的机制,如使用 QMetaObject::invokeMethod 在目标线程中异步执行方法,或使用 QThread 的 postEvent 和 QCoreApplication 的 event/eventFilter 等。

建议在处理线程间通信时,仔细阅读 Qt 的官方文档,并了解不同连接类型和相关线程模型的概念和最佳实践。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt信号机制中,信号函数函数的参数不一定要完全一致。但是,有一些规则需要遵循: 1. 信号函数的参数类型必须与函数的参数类型兼容。如果信号函数有多个参数,函数的参数数量可以少于信号函数的参数数量,但是必须按照相同的顺序进行匹配。 2. 如果信号函数的参数是引用类型(如const引用),则函数的参数也必须是引用类型。同样,如果信号函数的参数是指针类型,函数的参数也必须是指针类型。 3. 如果信号函数函数的参数类型不完全匹配,但可以进行隐式转换,则也可以成功地连接信号。 4. 如果信号函数函数的参数类型不兼容,并且没有合适的隐式转换,那么连接将会失败。 以下是一个示例,演示了信号函数参数不完全一致但仍然可以连接的情况: ```cpp class MyObject : public QObject { Q_OBJECT public slots: void mySlot(int value) { // 函数代码 } }; // 创建对象和连接信号 MyObject* obj = new MyObject(); QPushButton* button = new QPushButton("Click me"); connect(button, SIGNAL(clicked()), obj, SLOT(mySlot())); // 信号函数没有参数,函数有一个int参数 ``` 在上面的示例中,QPushButton的`clicked()`信号没有参数,但是成功地连接到了MyObject的`mySlot(int value)`函数。这是因为Qt会自动将`clicked()`信号的触发转换为一个不带参数的调用。 总结起来,信号函数的参数不一定要完全一致,但是必须是兼容的或者可以进行隐式转换才能成功连接。 希望这个解答对您有帮助。如有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值