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

Qt自定义类型

概述

在使用Qt创建用户界面时,特别是那些具有特殊控件和特性的界面时,开发人员有时需要创建新的数据类型,以便与Qt现有的值类型集一起使用或代替它们。

QSize、QColor和QString等标准类型都可以存储在QVariant对象中,作为基于qobject的类的属性类型,并在信号槽通信中发出。

在本文中,我们将使用一个自定义类型,并描述如何将其集成到Qt的对象模型中,以便它能够以与标准Qt类型相同的方式存储。然后,我们将展示如何注册自定义类型以允许它在信号和插槽连接中使用。

创建自定义类型

在开始之前,我们需要确保创建的自定义类型满足QMetaType的所有要求。换句话说,它必须提供:

  • 一个公共的默认构造函数,
  • 一个公共复制构造函数,以及
  • 一个公共析构函数。

下面的Message类定义包含了这些成员:

class Message
{
public:Message() = default;~Message() = default;Message(const Message &) = default;Message &operator=(const Message &) = default;Message(const QString &body, const QStringList &headers);QString body() const;QStringList headers() const;private:QString m_body;QStringList m_headers;
};

这个类还提供了一个普通使用的构造函数,以及两个用于获取私有数据的公共成员函数。

用QMetaType声明类型

Message类只需要适当的实现就可以使用。然而,Qt的类型系统将无法理解如何存储,检索和序列化这个类的实例,如果没有一些帮助。例如,我们将无法在QVariant中存储消息值

Qt中负责自定义类型的类是QMetaType。为了让这个类知道类型,我们在定义类的头文件中调用Q_DECLARE_METATYPE()宏:

Q_DECLARE_METATYPE(Message);

这使得将消息值存储在QVariant对象中并在以后检索成为可能。有关演示这一点的代码,请参阅自定义类型示例。

Q_DECLARE_METATYPE()宏也可以将这些值用作信号的参数,但只能在直接的信号槽连接中使用。为了使自定义类型通常可用于信号和插槽机制,我们需要执行一些额外的工作。

创建和销毁自定义对象

虽然前一节中的声明使该类型可用于直接的信号槽连接,但不能用于排队的信号槽连接,例如不同线程中的对象之间的连接。这是因为元对象系统不知道如何在运行时处理自定义类型对象的创建和销毁

要在运行时创建对象,请调用qRegisterMetaType()模板函数将其注册到元对象系统。这也使得该类型可用于排队信号槽通信,只要您在创建第一个使用该类型的连接之前调用它。

排队的自定义类型示例声明了一个注册在main.cpp文件中的块类:

int main(int argc, char *argv[])
{QApplication app(argc, argv);...qRegisterMetaType<Block>();...return app.exec();
}

此类型稍后在window.cpp文件中的信号槽连接中使用:

Window::Window(QWidget *parent): QWidget(parent), thread(new RenderThread(this))
{...connect(thread, &RenderThread::sendBlock,this, &Window::addBlock);...setWindowTitle(tr("Queued Custom Type"));
}

如果在未注册的情况下在排队连接中使用了类型,则将在控制台中打印警告;例如:

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

使类型可打印

使自定义类型可打印用于调试通常是非常有用的,如下面的代码所示:

    Message message(body, headers);qDebug() << "Original:" << message;

这可以通过为该类型创建一个流操作符来实现,该操作符通常在该类型的头文件中定义:

QDebug operator<<(QDebug dbg, const Message &message);

自定义类型示例中Message类型的实现做了一些努力,使可打印的表示尽可能可读:

QDebug operator<<(QDebug dbg, const Message &message)
{const QString body = message.body();QVector<QStringRef> pieces = body.splitRef(QLatin1String("\r\n"), Qt::SkipEmptyParts);if (pieces.isEmpty())dbg.nospace() << "Message()";else if (pieces.size() == 1)dbg.nospace() << "Message(" << pieces.first() << ")";elsedbg.nospace() << "Message(" << pieces.first() << " ...)";return dbg.maybeSpace();
}

当然,发送到调试流的输出可以按照您的喜好设置为简单或复杂。请注意,该函数返回的值是QDebug对象本身,尽管这通常是通过调用QDebug的maybeSpace()成员函数获得的,该函数用空格字符填充流,使其更具可读性。

Creating Custom Qt Types | Qt Core 5.15.17

相关文章:

Qt自定义类型

概述 在使用Qt创建用户界面时&#xff0c;特别是那些具有特殊控件和特性的界面时&#xff0c;开发人员有时需要创建新的数据类型&#xff0c;以便与Qt现有的值类型集一起使用或代替它们。 QSize、QColor和QString等标准类型都可以存储在QVariant对象中&#xff0c;作为基于qo…...

UE4_材质_材质节点_DepthFade

一、DepthFade参数 DepthFade&#xff08;深度消退&#xff09;表达式用来隐藏半透明对象与不透明对象相交时出现的不美观接缝。 项目说明属性消退距离&#xff08;Fade Distance&#xff09;这是应该发生消退的全局空间距离。未连接 FadeDistance&#xff08;FadeDistance&a…...

如何对GD32 MCU进行加密?

GD32 MCU有哪些加密方法呢&#xff1f;大家在平时项目开发的过程中&#xff0c;最后都可能会面临如何对出厂产品的MCU代码进行加密&#xff0c;避免产品流向市场被别人读取复制。 下面为大家介绍GD32 MCU所支持的几种常用的加密方法&#xff1a; 首先GD32 MCU本身支持防硬开盖…...

快速了解GPT-4o和GPT-4区别

GPT-4o简介 在5月14日的OpenAI举行春季发布会上&#xff0c;OpenAI在活动中发布了新旗舰模型“GPT-4o”&#xff01;据OpenAI首席技术官穆里穆拉蒂&#xff08;Muri Murati&#xff09;介绍&#xff0c;GPT-4o在继承GPT-4强大智能的同时&#xff0c;进一步提升了文本、图像及语…...

周末休息日也能及时回应客户消息!微信自动回复神器太就好用啦!

无论是在忙碌时&#xff0c;还是在周末休息日&#xff0c;如果没能及时回应客户&#xff0c;很可能会造成客户流失。 今天&#xff0c;我要为大家介绍一个多微管理神器——个微管理系统&#xff0c;它可以帮助你实现自动回复&#xff0c;提高回复效率。 自动通过好友请求 在…...

力扣404周赛 T1/T2/T3 枚举/动态规划/数组/模拟

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 3200.三角形的最大高度【简单】 题目&#xff1a; 给你两个整数 red 和 b…...

Taurus 性能测试工具详解

文章目录 简介原理安装编写测试配置运行测试集成其他工具结果分析优点与缺点优点缺点 参考资料总结 简介 Taurus 是一个开源的自动化测试工具&#xff0c;用于简化和增强性能测试流程。与其他性能测试工具不同&#xff0c;Taurus 旨在通过友好的 YAML 配置文件和对多种负载测试…...

天猫商品详情API接口(店铺|标题|主图|价格|SKU属性等)

天猫商品详情API接口为开发者提供了获取天猫商品详细信息的能力&#xff0c;包括店铺信息、商品标题、主图、价格、SKU属性等。以下是该接口的使用过程和相关技术要点&#xff1a; 注册账号并创建应用 注册账号&#xff1a;需要在天猫开放平台注册一个开发者账号。创建应用&a…...

双向广搜——AcWing 190. 字串变换

双向广搜 定义 双向广度优先搜索&#xff08;Bi-directional Breadth-First Search, Bi-BFS&#xff09;是一种在图或树中寻找两点间最短路径的算法。与传统的单向广度优先搜索相比&#xff0c;它从起始点和目标点同时开始搜索&#xff0c;从而有可能显著减少搜索空间&#x…...

工商业光伏项目如何快速开发?

一、前期调研与规划 1、屋顶资源评估&#xff1a;详细测量屋顶面积、承重能力及朝向&#xff0c;利用光伏业务管理软件进行日照分析和发电量预测&#xff0c;确保项目可行性。 2、政策与补贴研究&#xff1a;深入了解当地政府对工商业光伏项目的政策支持和补贴情况&#xff0…...

Kafka入门-分区及压缩

一、生产者消息分区 Kafka的消息组织方式实际上是三级结构&#xff1a;主题-分区-消息。主题下的每条消息只会保存在某一个分区中&#xff0c;而不会在多个分区中被保存多份。 分区的作用就是提供负载均衡的能力&#xff0c;或者说对数据进行分区的主要原因&#xff0c;就是为…...

被⽹络罪犯利⽤的5⼤ChatGPT越狱提⽰

⾃ChatGPT发布的近18个月以来&#xff0c;⽹络罪犯们已经能够利⽤⽣成式AI进⾏攻击。OpenAI在其内容政策中制定了限制措施&#xff0c;以阻⽌⽣成恶意内容。作为回应&#xff0c;攻击者们创建了⾃⼰的⽣成式AI平台&#xff0c;如 WormGPT和FraudGPT&#xff0c;并且他们还分享了…...

AVR晶体管测试仪开源制作与验证

AVR晶体管测试仪开源制作与验证 &#x1f4cd;原项目地址&#xff1a;https://www.mikrocontroller.net/articles/AVR_Transistortester github地址&#xff1a;https://github.com/Mikrocontroller-net/transistortester &#x1f388;EasyEDA项目地址&#xff1a;https://osh…...

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)...

文章目录 延迟任务精准发布文章 1)文章定时发布2)延迟任务概述 2.1)什么是延迟任务2.2)技术对比 2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现 4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目…...

不同系统间数据交换要通过 api 不能直接数据库访问

很多大数据开发提供数据给外部系统直接给表结构&#xff0c;这是不好的方式。在不同系统间进行数据交换时&#xff0c;通过API&#xff08;应用程序编程接口&#xff09;而非直接访问数据库是现代系统集成的一种最佳实践。 目录 为什么要通过API进行数据交换如何通过API进行数据…...

深度探索“目录名称无效“:原因、解决方案与最佳实践

目录名称无效&#xff1a;现象背后的秘密 在日常使用电脑或移动设备时&#xff0c;我们时常会遇到“目录名称无效”的错误提示&#xff0c;这一提示仿佛是一道无形的屏障&#xff0c;阻断了我们与重要数据的联系。从本质上讲&#xff0c;“目录名称无效”意味着系统无法识别或…...

open3d基础使用-简单易懂

Open3D是一个开源库&#xff0c;主要用于快速开发处理3D数据的软件。它提供了丰富的数据结构和算法&#xff0c;支持点云、网格和RGB-D图像等多种3D数据的处理。以下是对Open3D基础使用的详细归纳和说明&#xff1a; 一、安装Open3D Open3D可以通过Python的包管理器pip进行安…...

【前端】HTML+CSS复习记录【5】

文章目录 前言一、padding、margin、border&#xff08;边框边距&#xff09;二、样式优先级三、var&#xff08;使用 CSS 变量更改多个元素样式&#xff09;四、media quary&#xff08;媒体查询&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉…...

三分钟看懂SMD封装与COB封装的差异

全彩LED显示屏领域中&#xff0c;COB封装于SMD封装是比较常见的两种封装方式&#xff0c;SMD封装产品主要有常规小间距以及室内、户外型产品&#xff0c;COB封装产品主要集中在小间距以及微间距系列产品中&#xff0c;今天跟随COB显示屏厂家中品瑞一起快速看懂SMD封装与COB封装…...

深入理解策略梯度算法

策略梯度&#xff08;Policy Gradient&#xff09;算法是强化学习中的一种重要方法&#xff0c;通过优化策略以获得最大回报。本文将详细介绍策略梯度算法的基本原理&#xff0c;推导其数学公式&#xff0c;并提供具体的例子来指导其实现。 策略梯度算法的基本概念 在强化学习…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...