Qt中以qRegister开头的几个函数的用法说明

news2024/12/26 21:33:03

目录

1. 前言

2. qRegisterMetaTypeStreamOperators

    2.1. 函数功能简述

    2.2.用法举例1

3. qRegisterMetaType


1. 前言

        Qt通过qRegister开头的函数和Q_DECLARE开头的几个宏向Qt元系统注册、声明一些非基本类型。一旦声明、注册后,在Qt元系统中就可以很方便的利用这些非基本类型,这样对编程中的数据交互很方便。非基本类型是指除了一些基本类型之外的类型,如:除了int、float、qint......之外的类型,如:自定义类、结构体、枚举等。

         有关Q_DECLARE开头的几个宏的用法说明,请参见如下博文:

         《Qt中以Q_DECLARE开头的几个宏的用法说明》。

2. qRegisterMetaTypeStreamOperators

    2.1. 函数功能简述

该函数如下:

template <typename T>
void qRegisterMetaTypeStreamOperators(const char *typeName)

在Qt Assisant中省略了前面的模板声明关键字。这个函数为类型为T,名称为typeName(即参数)向Qt元系统注册流操作,之后,类型T就能用 如下函数执行流相关的操作:

static] bool QMetaType::load(QDataStream &stream, int type, void *data)
bool QMetaType::save(QDataStream &stream, int type, const void *data)

当流化一个QVariant对象时,常常会用到这个函数。如下:

qRegisterMetaTypeStreamOperators<MyClass>("MyClass");

流操作应实现如下的函数,否则编译会报错:

  QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
  QDataStream &operator>>(QDataStream &in, MyClass &myObj);

    2.2.用法举例1

#include <QtCore/QCoreApplication>
#include<QVariant>
#include<QDataStream>
#include <QBuffer> 
class CMyObj : public QObject
{
public:
    CMyObj()
    {
        m = 888;
    }
    ~CMyObj()
    {
        
    }
    CMyObj(const CMyObj& obj)
    {
        m = obj.m;
    }

    int getM() const
    {
        return m;
    }

    void setM(int nMy_m)
    {
        m = nMy_m;
    }
private:
    int m;
};

Q_DECLARE_METATYPE(CMyObj);

QDataStream& operator<< (QDataStream& stream, const CMyObj& myObj)
{
    auto m = myObj.getM();
    stream << m;
    return stream;
}
QDataStream& operator>> (QDataStream& stream, CMyObj& myObj)
{
    int m;
    stream >> m;
    myObj.setM(m);

    return stream;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 对CMyObj类注册流化操作
    qRegisterMetaTypeStreamOperators<CMyObj>("CMyObj");

  /*  CMyObj saveMyObj;
    QVariant varSave;
    varSave.setValue(saveMyObj);
    
    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream streamForSaveMyObj(&file); 
    streamForSaveMyObj << varSave;
    file.close();

    file.open(QIODevice::ReadOnly);
    QVariant varLoad;
    streamForSaveMyObj >> varLoad;
    auto k = varLoad.value<CMyObj>();
    auto m = k.getM();
    file.close();*/

    CMyObj saveMyObj;
    QVariant varSave;

    // 将CMyObj类的saveMyObj对象保存到QVariant,注意:需要用Q_DECLARE_METATYPE声明,否则编译会报错
    varSave.setValue(saveMyObj); 

    QBuffer buf;
    QDataStream streamForSaveMyObj(&buf);
    buf.open(QIODevice::WriteOnly);
    streamForSaveMyObj << varSave;  // 将QVariant保存到流,QBuffer你可以认为是一段内存。将其保存到一段内存中。
    buf.close();

    buf.open(QIODevice::ReadOnly);
    QVariant varLoad;
    streamForSaveMyObj >> varLoad;   // 将原先保存到内存的流中的QVariant对象取出来
    buf.close();

    auto loadMyObj = varLoad.value<CMyObj>(); // 从QVariant对象中恢复出原先的CMyObj类对象
    auto m = loadMyObj.getM(); // 输出888

    return a.exec();
}

说明:

  • 当将一个自定义的类,进行流化操作时,必须用qRegisterMetaTypeStreamOperators进行声明,否则编译会报错。如下:
  • 当将自定义的类对象保存到QVariant对象时,需要先用 用Q_DECLARE_METATYPE声明,否则编译会报错。具体参见:Qt中以Q_DECLARE开头的几个宏的用法说明。
  • 上面的代码将一个自定义的对象通过流保存到QBuffer对象中。QBuffer对象可以认为是内存中的一块区域。也可以像注释掉的那块代码那样保存到文件。
  • 上面代码将自定义对象写入流和从流读取出来放到main的同一个函数。实际开发中,可以利用类的成员变量进行跨函数数据交互,如:在类的A成员函数中将自定义对象写入流(该流是类的成员变量);然后在类的B成员函数中再将该自定义对象从流中读出来,这样可以方便数据的交互。

3. qRegisterMetaType

这个参见Qt assist,在此不再详述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神秘龙卷风

那道提示 打开后是一个加密压缩包&#xff0c;根据题目提示&#xff0c;这应该是一道暴力破解的题目 暴力破解后得到密码位5463 结果拿到是一串不止到啥的字符&#xff0c;根据提示应该是还要进行解码 经过查询&#xff0c;得知这个编码叫Brainfuck&#xff1a;&#xff08;下面…

【Java高级语法】(七)Object类:同志,关于Object类的情况你了解多少嘞?~

Java高级语法详解之Object类 :one: 概念:two: 使用2.1 equals()方法2.2 hashCode()方法2.3 toString()方法2.4 finalize()方法2.5 getClass()方法2.6 clone()方法2.7 wait()、notify()和 notifyAll()方法 :three: 使用场景:ear_of_rice: 总结:bookmark_tabs: 本文源码下载地址 …

【前端知识】React 基础巩固(十五)——书籍购物车简单案例

React 基础巩固(十五)——书籍购物车简单案例 案例代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"v…

性能测试基础知识(二)性能测试流程

性能测试流程 一、性能测试需求分析二、性能测试计划和方案三、性能测试用例设计四、性能测试执行五、性能测试分析和调优六、性能测试报告总结 一、性能测试需求分析 1、熟悉被测系统&#xff08;业务功能、技术架构&#xff09; 2、明确测试内容 一般有以下几种类型&#xf…

chatgpt赋能python:Python中如何实现图形移动:探索基本概念和代码示例

Python中如何实现图形移动&#xff1a;探索基本概念和代码示例 介绍 图形移动是计算机科学中的基本概念&#xff0c;它与广泛应用的游戏、动画和用户界面设计有密切关系。 在Python中&#xff0c;我们可以使用各种库和框架来实现图形移动和动画效果&#xff0c;包括Tkinter&a…

chatgpt赋能python:Python截取指定字符操作:让你的SEO优化变得更简单

Python截取指定字符操作&#xff1a;让你的SEO优化变得更简单 在SEO优化中&#xff0c;截取指定字符是一个非常常见的操作。Python作为一款开源的高级编程语言&#xff0c;提供了许多方便的函数和方法来处理文本操作&#xff0c;包括截取指定字符。在本文中&#xff0c;我们将…

第三章 选择与循环

程序员必备技能(思想)&#xff1a;增量编写法。每写一部分代码要及时运行看结果是否正确&#xff0c;对于复杂程序很重要。 常用的运算符优先级&#xff1a; 逻辑非 &#xff01;> 算术运算符 > 关系运算符 > && > || > 赋值运算符 单目运算符 逻辑非…

chatgpt赋能python:Python如何随机生成26个字母

Python如何随机生成26个字母 Python是一种流行的编程语言&#xff0c;被广泛用于数据分析、人工智能和Web开发等领域。 Python中有很多库可以用于随机生成字符&#xff0c;包括Python内置的random库和第三方库string。 在本文中&#xff0c;我们将介绍如何使用这些库在Python中…

《Java黑皮书基础篇第10版》 第16章【笔记】

第十六章 JavaFX UI 组件和多媒体 16.1 引言 16.2 Labeled和Label在这里插入图片描述 标签(label)是一个显示小段文字&#xff0c;一个节点或同时显示两者的区域。它经常用来给其他组件(通常为文本域)做标签&#xff0c;Label类继承自Labeled抽象类 16.3 - 16.4 按钮和复选框…

目标检测YOLO实战应用案例100讲-基于深度学习的遥感目标检测算法FPGA部署实现研究

基于深度学习的目标检测网络剪枝及FPGA部署 随着科技的发展,人工智能的发展正在促进计算机视觉的智能化广泛应用。如手 机上的语音识别可以将声音转化成文字、门禁识别人脸通行、美颜相机对人像加上跟 踪特效等,这些都是人工智能在我们生活中的应用。 人工智能对图像领域…

【Docker】Linux安装步骤

目录 下载关于Docker的依赖环境安装Docker启动&#xff0c;并设置为开机自动启动&#xff0c;测试开启远程API访问端口登录harbor仓库 下载关于Docker的依赖环境 输入以下命令安装依赖环境 回车 yum -y install yum-utils device-mapper-persistent-datalvm2 安装Docker 下…

河道水面垃圾识别检测算法 yolov5

河道水面垃圾识别检测系统采用yolov5忘了模型计算机视觉技术&#xff0c;河道水面垃圾识别检测算法通过在河道上安装摄像头&#xff0c;对水面垃圾进行实时监测自动识别并记录水面垃圾&#xff0c;及时通知环保部门进行处理。近几年来&#xff0c;目标检测算法取得了很大的突破…

树莓派 4B 多串口配置

0. 实验准备以及原理 0.1 实验准备 安装树莓派官方系统的树莓派 4B&#xff0c;有 python 环境&#xff0c;安装了 serial 库 杜邦线若干 屏幕或者可以使用 VNC 进入到树莓派的图形界面 0.2 原理 树莓派 4B 有 UART0&#xff08;PL011&#xff09;、UART1&#xff08;mini …

ldsc python程序安装以及测试

教程参考&#xff1a; https://zhuanlan.zhihu.com/p/379628546https://github.com/bulik/ldsc 1. 软件安装 1.1 windows安装教程 首先配置&#xff1a; anaconda&#xff0c;为了需要conda环境git&#xff0c;为了下载github中的ldsc程序 打开windows电脑中的promote&am…

chatgpt赋能python:Python如何隐藏请求IP地址提高SEO效果

Python如何隐藏请求IP地址提高SEO效果 引言 在进行网站优化的过程当中&#xff0c;隐藏请求的IP地址是一个重要的环节。这个技巧不仅能够提高SEO的效果&#xff0c;还能够保护我们的网络安全&#xff0c;防止遭受黑客攻击。本文将介绍Python如何隐藏请求IP地址&#xff0c;以…

Spring应用启动分析优化

最近在搞应用的启动优化&#xff0c;参考一些可以显著提高 Java 启动速度方法和spring-boot-startup-report实现了此项目&#xff0c;Spring Startup Ananlyzer 采集Spring应用启动过程数据&#xff0c;生成交互式分析报告(HTML)&#xff0c;用于分析Spring应用启动卡点&#x…

让数据不再裸奔:学习使用AES加解密算法

目录 1. application.yml文件配置 2. AES加解密工具类 3. AES消息秘钥、AES秘钥初始向量、转字节数组工具类 4. AES加解密测试 我们为什么要用AES算法来进行加解密&#xff1f; AES&#xff08;Advanced Encryption Standard&#xff09;&#xff0c;又称高级加密标准&am…

C语言之生成随机数方法(C代码实现猜数字游戏)

C语言之生成随机数方法&#xff08;C代码实现猜数字游戏&#xff09; 首先先把猜数字游戏的代码给大家暂时出来&#xff0c;然后我们在根据代码的步骤一步一步的推导 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <tim…

【ChatGPT】一个凭借两百多年历史的公式崛起的巨星

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

一分钟学一个 Linux 命令 - ps

前言 大家好&#xff0c;我是 god23bin。欢迎来到《一分钟学一个 Linux 命令》系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天要说的是 ps 命令。 什么是 ps 命令&#xff1f; ps 的英文全称是 process status&#xff0c;意思是进程状态。 …