当前位置: 首页 > news >正文

汇款账号 网站建设软文代写接单平台

汇款账号 网站建设,软文代写接单平台,cms开发网,嘉兴品牌网站建设📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…
  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 需要注册信号参数的情况
      • 二. 不注册可能引发的问题
      • 三. 如何注册自定义类型
      • 四. 示例:跨线程信号槽的正确用法
      • 五. 为什么“仅用 qRegisterMetaType 也能工作”?


一. 需要注册信号参数的情况

1、跨线程的信号槽连接(使用 QueuedConnection)

当信号和槽位于不同线程,且连接方式为 Qt::QueuedConnectionQt::BlockingQueuedConnection 时,参数类型必须注册

原因:跨线程通信时,Qt 需要将参数序列化到接收线程的事件队列中,这要求类型必须能被 Qt 的元对象系统识别。

2、使用 QVariant 传递自定义类型

如果信号参数是自定义类型,且需要与 QVariant 结合使用,必须注册类型。


二. 不注册可能引发的问题

1、运行时警告或错误

如果未注册自定义类型,Qt 会在运行时输出类似以下警告:

QObject::connect: Cannot queue arguments of type 'MyCustomType'
(Make sure 'MyCustomType' is registered using qRegisterMetaType().)

后果:跨线程的信号槽调用会失败,槽函数不会执行,程序可能无响应或崩溃。

2、参数无法正确传递

未注册的类型无法被 Qt 序列化/反序列化,导致槽函数接收到的参数是无效或未初始化的值。

3、无法与 QVariant 交互

自定义类型无法通过 QVariant 存储或传递,导致相关功能(如属性系统、模型/视图)失效。


三. 如何注册自定义类型

1、使用 Q_DECLARE_METATYPE 宏

#include <QMetaType>// 自定义类型定义
struct MyCustomType {int id;QString name;
};// 声明元类型支持(放在头文件末尾)
Q_DECLARE_METATYPE(MyCustomType)

Q_DECLARE_METATYPE 的作用

1)编译时元信息生成

Q_DECLARE_METATYPE 宏会为类型生成编译时的元信息(如类型名称、大小、对齐方式等),使得以下功能可用:

  • QVariant 的构造和类型转换(例如 QVariant::fromValue 和 QVariant::value)。
  • 类型在模板和宏中的静态识别(例如 QMetaType 的静态接口)。

2)隐式要求

如果未使用 Q_DECLARE_METATYPE,即使通过 qRegisterMetaType 注册了类型,以下操作可能失败:

MyCustomType data;
QVariant variant = QVariant::fromValue(data); // 编译错误!

2、使用 qRegisterMetaType 注册类型

在程序启动时(如 main 函数、构造函数等中)注册类型:

#include <QMetaType>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 注册自定义类型qRegisterMetaType<MyCustomType>("MyCustomType");// 如果类型有默认构造函数,可以简写为:qRegisterMetaType<MyCustomType>();return app.exec();
}

四. 示例:跨线程信号槽的正确用法

// 自定义类型
struct MyCustomType {int id;QString name;
};
Q_DECLARE_METATYPE(MyCustomType)// 发送者类
class Sender : public QObject {Q_OBJECT
public:void sendData() {MyCustomType data{1, "Test"};emit signalData(data); // 发送信号}
signals:void signalData(const MyCustomType& data);
};// 接收者类
class Receiver : public QObject {Q_OBJECT
public slots:void onDataReceived(const MyCustomType& data) {qDebug() << "Received:" << data.id << data.name;}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);qRegisterMetaType<MyCustomType>(); // 注册类型Sender sender;Receiver receiver;QThread thread;// 跨线程连接QObject::connect(&sender, &Sender::signalData,&receiver, &Receiver::onDataReceived,Qt::QueuedConnection);//将接受者移至线程中,这样与发送者即分属于不同的线程中receiver.moveToThread(&thread);thread.start();sender.sendData();return app.exec();
}

五. 为什么“仅用 qRegisterMetaType 也能工作”?

场景 1:跨线程信号槽通信

  • 如果仅在跨线程信号槽中使用自定义类型,且未直接操作 QVariant,程序可能正常执行。
  • 原因
    qRegisterMetaType 在运行时注册了类型,使得 Qt 能正确序列化参数。
    Q_DECLARE_METATYPE 的缺失在此场景下可能不会立即暴露问题。

场景 2:低版本 Qt 的宽松处理

  • 某些旧版 Qt(如 Qt4)对类型注册的要求较为宽松,可能允许未声明 Q_DECLARE_METATYPE。
  • 风险:
    这种行为是未定义的,可能因 Qt 版本或平台不同而失效。

下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。
http://www.cadmedia.cn/news/2198.html

相关文章:

  • 网站建设那家公司好重庆发布的最新消息今天
  • 用dede做网站去掉版权企业网站推广有哪些
  • 网站排名靠前方法网络舆情分析
  • 如何做b2c网站百度发布
  • 宁阳网页设计吉林seo技术交流
  • 电子商务网站建设作用保定seo推广外包
  • 济南招聘网武汉seo公司
  • 网络舆情应急预案求好用的seo软件
  • 高校网站建设申请怎么写天津seo优化公司哪家好
  • 提供网站建设案例百度怎么投放广告
  • 互联网App网站建设方案推广的公司
  • 动漫制作专业可以升大专吗厦门网站seo
  • 网站找哪家做较好百度关键词关键词大全
  • 政府网站模板下载整合营销传播的定义
  • 佛山企业快速建站广州网站优化推广
  • 沈阳大型网站建设卡点视频免费制作软件
  • 网站怎么做留言提交功能淘宝指数查询
  • 网站开发趋势好看的web网页
  • 设计网页页面优化大师下载安装免费
  • 苏州网站推广949公社招聘信息
  • 高清免费爱做网站河南郑州网站推广优化外包
  • 网站建设中 翻译怎么提高seo关键词排名
  • 太湖县住房和城乡建设网站市建设局点击seo软件
  • 建设网站图片大全电商网站设计
  • 南京多样化的网站建设定制公司重庆森林台词
  • 集团网站建设行业现状浏览器谷歌手机版下载
  • 制作网站可以赚钱吗免费打广告网站
  • 盐山网站建设如何在网上推广自己的产品
  • 曲阜网架公司网站优化 福州
  • 公司网站建设需求书seo的工作原理