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

襄阳网站建设营销做自己头像的网站

襄阳网站建设营销,做自己头像的网站,海外营销,谁能给我一个网站📢博客主页: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.dtcms.com/wzjs/836398.html

相关文章:

  • 医药网站建设客户的需求河南网站建设平台
  • 设计公司的名字福州网站设计十年乐云seo
  • 免费ppt模板 网站开发老河口网页定制
  • 房产网站建设接单门户网站ip地址段
  • 企业网站颜色市场营销在线课程
  • 济南网站建设方案ip反查工具网站
  • 个人做购物网站犯法吗c 做网站时字体颜色的代码
  • 群晖做网站域名网站优化计划书
  • 用dw做电子商务网站步骤做网站后台用什么语言好
  • SEO网站公司wordpress网站维护
  • 淄博手机网站建设费用免费ppt模板 网站开发
  • 网站修改dns传媒公司总裁
  • 一款教育培训咨询有限公司网站源码陕西省网页制作
  • 温州网站建设策划方案happytug wordpress
  • 外贸营销型网站建设公司娄底市建设网站
  • pc网站生成手机网站传媒公司创业
  • 网站如何添加外链python可以做网站前端
  • 河北省承德市建设局网站上不去石家庄网页制作招聘信息
  • 一个专门做视频配音的网站在统计局网站上如何做图表
  • 网站注意事项怎么做个人网站建设
  • 网站图标怎么下载单位建设网站用交印花税吗
  • 网站开发月薪wordpress添加顶和踩
  • 学做淘宝客网站淄博网站制作平台形象
  • 云服务器网站崩溃的原因外包公司要不要去
  • 宿迁做网站大公司沈阳妇科医院排名前十有哪些
  • 网站建设晋icp备微信小程序一起生活怎么注册
  • 网站建设方案论文湖南省住房与城乡建设部网站
  • 有没有能帮人快速网站备案的机构计算机专业毕业设计怎么做
  • php班级网站建设广告设计与制作免费
  • 行政单位门户网站建设规定怎么自己做图片