马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在 Qt 中,自界说信号和槽是与事故和对象交互的焦点机制之一。创建自界说信号和槽时,有几个告急事项必要注意,以确保它们可以或许精确工作。以下是一些必要注意的关键点:
1. 信号和槽的声明
信号声明:信号应该在 signals 部门声明。它们通常是 void 返回范例,但也可以有参数。
槽声明:槽函数必要在 public slots(或 private slots)部门声明。槽函数的参数应与信号的参数匹配。
示例:- class MyClass : public QObject {
- Q_OBJECT // 必须包含这一宏
- public:
- MyClass() {}
- signals:
- void customSignal(int value); // 自定义信号,传递一个整数
- public slots:
- void customSlot(int value) { // 自定义槽,接收一个整数
- qDebug() << "Received value:" << value;
- }
- };
复制代码 2. 使用 Q_OBJECT 宏
Q_OBJECT 宏:这是在 Qt 中实现信号和槽的关键。每个继续自 QObject 的类都必要包罗 Q_OBJECT 宏,否则 Qt 的元对象体系将无法工作。此宏启用 Qt 的信号槽机制和其他功能,如动态属性和运行时范例信息。
位置:Q_OBJECT 宏必须位于类界说的顶部(public 和 private 之前)。
3. 毗连信号和槽
使用 QObject::connect() 方法来毗连信号和槽。connect() 的第一个参数是发送信号的对象,第二个参数是信号,第三个参数是吸收槽的对象,第四个参数是槽。
示例:- MyClass obj1, obj2;
- QObject::connect(&obj1, &MyClass::customSignal, &obj2, &MyClass::customSlot);
复制代码 在上面的代码中,obj1 的 customSignal 信号与 obj2 的 customSlot 槽毗连。
4. 信号和槽的参数匹配
信号的参数范例必须与槽函数的参数范例匹配。Qt 会实验自动转换参数范例(如 int 转为 double)。但是,最好确保参数范例完全划一。
示例:- // 自定义信号和槽的参数类型匹配
- emit customSignal(5); // 发射信号
复制代码 5. 信号的发射
信号不能直接调用。你必须使用 emit 关键字来发射信号。- emit customSignal(10); // 发射信号
复制代码 6. 信号和槽的毗连范例
Qt 提供了几种差异的毗连范例,决定了信号和槽毗连的举动:
- Qt::AutoConnection(默认):根据信号的发射线程与槽地点线程的关系自动选择毗连范例。
- Qt:
irectConnection:信号直接调用槽函数(实用于信号和槽在同一线程的情况)。
- Qt:
ueuedConnection:信号在目标对象的事故队列中列队,稍后在目标线程实验槽函数(实用于信号和槽在差异线程时)。
- Qt::BlockingQueuedConnection:信号发射时会壅闭当火线程,直到槽函数实验完毕。
示例:
- QObject::connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::QueuedConnection);
复制代码 7. 制止直接调用槽函数
在 Qt 中,信号与槽的毗连是通过事故循环机制异步调用的,不应直接调用槽函数。直接调用大概绕过 Qt 的事故机制,导致不符合计划预期的举动。
8. 槽函数的返回范例
槽函数应该具有 void 返回范例。如果槽函数返回其他范例,Qt 会忽略返回值,且这会影响信号与槽的毗连和调用。
9. 线程间的信号和槽毗连
信号和槽可以在差异线程间举行毗连。通常情况下,线程间的信号和槽毗连会使用 Qt: ueuedConnection 来包管线程安全,确保槽函数在目标线程的事故队列中实验。
如果必要在子线程中发射信号并处置惩罚,可以使用 QThread 的信号和槽机制。
10. 自界说信号的范例
如果你使用自界说范例作为信号和槽的参数,确保该自界说范例已经使用 Q_DECLARE_METATYPE 宏声明,以便 Qt 的元对象体系可以精确处置惩罚它。- class MyType {
- // 自定义类型
- };
- Q_DECLARE_METATYPE(MyType)
复制代码 然后你可以在信号和槽中使用这个自界说范例。
11. 断开信号和槽的毗连
可以使用 QObject::disconnect() 来断开信号和槽的毗连:- QObject::disconnect(&obj1, &MyClass::customSignal, &obj2, &MyClass::customSlot);
复制代码 总结
使用 Q_OBJECT 宏: 是实现信号和槽的关键。
确保参数匹配: 信号和槽的参数范例必须划一。
使用 emit 发射信号: 发射信号时使用 emit 关键字。
选择精确的毗连范例: 根据必要选择符合的信号槽毗连范例,尤其在多线程中。
制止直接调用槽函数: 信号与槽的调用应通过 Qt 的信号槽机制,制止直接调用槽函数。
自界说范例必要声明: 自界说范例作为信号槽参数时必要使用 Q_DECLARE_METATYPE。
依照这些注意事项,可以或许确保 Qt 中自界说信号和槽机制的精确实现与使用。
|