QVariant类api及相关用法

news2024/11/24 1:12:14

目录

1、QVariant对象概述

2、QVariant对象的使用

3.使用QVariant对QT中标准数据类型进行处理

 4.使用QVariant对QT中自定义数据类型进行处理

setValue     

fromValue    

canConvert


1、QVariant对象概述

在Qt中,QVariant是一个通用的值容器,它可以存储任意类型的数据,例如整数、字符串、列表等等。它的主要作用是提供一种通用的数据类型,方便在不同的函数、类、模块之间传递数据。

2、QVariant对象的使用

QVariant对象的使用非常简单,主要包括以下几个方面:

存储数据:可以通过构造函数、赋值操作符、setValue函数等方法将数据存储到QVariant对象中。例如:

QVariant v1 = 10; // 存储整数
QVariant v2 = "hello"; // 存储字符串
QVariant v3 = QList<int>() << 1 << 2 << 3; // 存储整数列表

获取数据:可以通过toXXX函数将QVariant对象转换为指定类型的数据。例如:

int n = v1.toInt(); // 将整数转换为int类型
QString str = v2.toString(); // 将字符串转换为QString类型
QList<int> list = v3.toList(); // 将整数列表转换为QList<int>类型
 

判断数据类型:可以使用type函数判断QVariant对象中存储的数据类型。例如:

if (v1.type() == QVariant::Int) {
    // v1中存储的是整数
}

清空数据:可以使用clear函数清空QVariant对象中存储的数据。例如:

v1.clear(); // 清空v1中存储的数据

QVariant类提供了三种构造函数:

1. QVariant()

默认构造函数,创建一个空的QVariant对象。

2. QVariant(const T &value)

模板构造函数,可使用任何类型的值作为参数,示例代码:

int i = 10;
QVariant v(i);

3. QVariant(QVariant::Type type)

构造函数,用于在不存储任何值的情况下创建一个指定类型的QVariant对象,示例代码:

QVariant v(QVariant::Int);

使用这个构造函数创建的QVariant对象不包含数据,但是有一个类型。可以通过使用setValue()或转换操作符将数据添加到对象中。

3.使用QVariant对QT中标准数据类型进行处理

先在mainwindow.h头文件中添加一个测试函数,这个函数的功能是两个变量进行加法运算

 在mainwindow.cpp中写以下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//此处调用了C++隐式类型转换
    //整形数
    int value = dataPlus(10,20).toInt();
    //字符串
    QString str = dataPlus("hello","world").toString();
    qDebug() << "int value: "<<value;
    qDebug() <<"string value: "<<str;
}

MainWindow::~MainWindow()
{
    delete ui;
}

QVariant MainWindow::dataPlus(QVariant a, QVariant b)
{
    QVariant ret;
    //判断当前参数的类型是字符串还是整形数
    if(a.type() == QVariant::Int && b.type() == QVariant::Int)
    {
        ret = QVariant(a.toInt()+b.toInt());
    }
    else if (a.type() == QVariant::String && b.type() == QVariant::String)
    {
        ret.setValue(a.toString()+b.toString());
    }
    return ret;
}

运行结果:

 4.使用QVariant对QT中自定义数据类型进行处理

        Q_DECLARE_METATYPE()是一个宏定义,用于向Qt元对象系统中注册自定义类型。当我们需要在信号和槽中传递用户定义的类型时,需要使用该宏将该类型注册到Qt的元对象系统中,以便可以在元对象系统中使用该类型的变量、参数和返回值。该宏需要接收一个类型的名称作为参数,例如:

Q_DECLARE_METATYPE(MyCustomType)

mainwindow.h中写入:

struct Person
{
    int id;
    QString name;
};
Q_DECLARE_METATYPE(Person)

mainwindow.cpp中写入:

    //创建Person对象
    Person p;
    p.id = 100;
    p.name = "小明";
//方法1
#if 0
    QVariant v;
    v.setValue(p);
//方法2
#else
    QVariant v = QVariant::fromValue(p);
#endif
    //取出v对象中的数据
    if(v.canConvert<Person>())
    {
        Person tmp = v.value<Person>();
        qDebug() <<"id: "<<tmp.id<<",name: "<<tmp.name;
    }

        

 对上面代码的一些补充:

setValue     

   setValue是QVariant类的一个成员函数,用于设置QVariant对象的值。它接受一个任意类型的参数,将其转换为QVariant类型,然后将该QVariant类型的值设置给调用函数的QVariant对象。例如,可以使用如下方式设置一个整数值给QVariant对象:

QVariant var;
int value = 42;
var.setValue(value);

fromValue    

    fromValue是Qt的QVariant类的一个静态成员函数,用来将一个给定的值转换为QVariant类型的变量。该函数可以接收任何类型的值,包括基本数据类型、自定义类和结构等。例如,可以使用如下方式将一个整数值转换为QVariant类型的变量:

int value = 42;
QVariant var = QVariant::fromValue(value);

        这样,变量var就被赋值为一个QVariant类型的变量,并包含值为42的整数。在使用QVariant作为参数传递时,可以使用fromValue函数避免手动转换类型,从而简化代码,提高代码可读性和可维护性。

        需要注意的是,QVariant的setValue和fromValue函数需要在类型注册到元对象系统中后才能正常使用。如果尝试将未注册的自定义类型传递给该函数,将会在编译时或运行时出现错误。因此,在使用setValue和fromValue函数之前,需要先使用Q_DECLARE_METATYPE宏将自定义类型注册到元对象系统中。

canConvert

canConvert是QVariant类的一个成员函数,用于检查QVariant对象是否可以转换为指定的类型。它接受一个Qt类型标识符作为参数,返回一个布尔值,表示是否可以将QVariant对象转换为该类型。

本文还涉及到了C++模板的知识,可以参考:

C++模板_小梁今天敲代码了吗的博客-CSDN博客

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

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

相关文章

【kubernetes】Docker与获取转证书工具安装、kubernetes软件安装

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

没有“中间商赚差价”, OpenVINO™ 直接支持 PyTorch 模型对象

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 没有“中间商赚差价”&#xff0c; OpenVINO™ 直接支持 PyTorch 模型对象 背景 作为最热门的开源深度学习框架之一&#xff0c;PyTorch 的易用性和灵活性使其深受学术和研究界的喜爱。之前 OpenVINO™ 对于 Py…

人脸检测——基于机器学习2】Haar特性

1.什么是Haar特征 Haar特征是一种反映人脸灰度差异的矩形特征,因其与Haar小波类似而得名。 2.什么是Haar小波 Haar小波: 定义 其波形图为 由图2.1可以看出,Haar小波可以看作二值 分类问题,如同Haar矩阵特征非黑即白,故Haar矩阵特征又称为类Haar特征。 3.Haar特征 H…

React项目引入Arco Design,以及Arco Design Pro 架构

创建项目 创建 react-arco 项目 pnpm create vite my-vue-app --template react安装 arco-design/web-react 安装 react 版的 arco-design 基础使用 添加一个按钮&#xff0c;App.tsx import "./App.css"; import { Button } from "arco-design/web-react…

基本类型与包装类型区别

知识点概括&#xff1a; 简介&#xff1a; Java有八种基本类型&#xff0c;byte&#xff0c; short&#xff0c; int&#xff0c; long&#xff0c; float&#xff0c; double&#xff0c; char&#xff0c; boolean。 对应八种包装类&#xff0c;Byte&#xff0c; Short&…

【Python架构】在 Python 中使用架构模式管理复杂性

你的源代码是不是感觉像一个大泥球&#xff1f;依赖项是否在您的代码库中交织在一起&#xff0c;以至于改变感觉很危险或不可能&#xff1f; 随着业务的增长和领域模型&#xff08;您在应用程序中解决的业务问题&#xff09;变得更加复杂&#xff0c;我们如何在不从头开始重新编…

Android初体验

文章目录 前言一、安卓架构1.1 安卓架构1.2 信息安全1.3 兼容性测试 二、使用WSL编译安卓低版本&#xff08;10&#xff09;总结 前言 Android 是一个适用于移动设备的开源操作系统&#xff0c;也是由 Google 主导的对应开源项目。 最初&#xff0c;Android只在移动设备中流行…

快码住! 帮你巧妙记忆C语言运算符的优先级顺序!

文章目录 C语言中的运算符C语言中运算符的优先级巧妙记忆运算符优先级的方法因不明确优先级而造成的常见问题 C语言中的运算符 C语言中的运算符说多也多&#xff0c;说不多也不多&#xff0c;包括以下运算符&#xff1a; C语言中运算符的优先级 C语言运算符优先级表&#xff…

Springboot--关于自定义stater的yml无法提示

1.前言 在以前在搭建架构的时候就碰到了类似的情况&#xff0c;在使用EnableConfigurationProperties注解的时候&#xff0c;不管怎样&#xff0c;在项目中引入了该starter的情况下依然不发自动的提示properties里面的属性。 Data ConfigurationProperties(prefix "pro…

python selenium2/webdriver自动化测试系列教程!?

以下是 Python Selenium2/WebDriver 自动化测试系列教程&#xff0c;希望能对您有所帮助&#xff1a; 1、安装 Selenium WebDriver 在安装 Python 的基础上&#xff0c;请使用 pip 命令安装 Selenium WebDriver&#xff1a; pip install selenium 2、配置浏览器驱动程序 S…

UDP编程

前置知识 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags);sockfd&#xff1a;表示要发送数据的套接字描述符。它是由socket函数创建的套接字返回的文件描述符。 buf&#xff1a;是一个指向要…

高级SQL语句

高级SQL语句 建立实验环境高级语句1.---- SELECT ----显示表格中一个或数个字段的所有数据记录2.---- DISTINCT ----不显示重复的数据记录3.---- WHERE ----有条件查询4.---- AND OR ----且 或 &#xff08;一般配合where使用&#xff09;5.---- IN ----显示已知的值的数据记录…

【人工智能技术专题】「入门到精通系列教程」零基础带你掌握人工智能全流程技术体系和实战指南(人工智能理论知识概论)

零基础带你掌握人工智能全流程技术体系和实战指南 前言专栏介绍专栏说明学习大纲前提条件面向读者学习目标人工智能背景介绍概念说明定义 目标方向目标人工智能的主要目标人工智能的应用领域 人工智能学科领域人工智能分类基于应用的人工智能弱AI&#xff08;弱人工智能&#x…

【干货】Android系统定制基础篇:第二部分(Launcher3支持键盘切换焦点、开发者模式密码确认、禁止非预装应用安装、配置时间)

1、Android Launcher3支持键盘切换焦点 Android Launcher3 默认并不支持键盘操作&#xff0c;无法切换焦点&#xff0c;在一些需要支持键盘或遥控操作的设备中无法使用&#xff0c;因些对 Launcher3 做简单修改&#xff0c;使其支持键盘切换焦点。 diff --git a/packages/app…

在字节跳动做了5年软件测试,无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次…

JS-快速入门

目录 变量原生数据类型模板字符串字符串的内置属性、方法数组数组创建方式数组值操作获取值添加值删除值判断是否是数组获取值的索引 对象创建对象&#xff0c;为对象创建新属性对象值存到同名常(变)量中 对象数组和JSON创建对象数组对象数组取值对象数组转JSON数据 if条件语句…

ELK技术堆栈(yum安装部署)

ELK技术堆栈&#xff08;yum安装部署&#xff09; 目录 ELK技术堆栈可以应用于各种场景 ELK的工作原理如下&#xff1a; 它由三个核心组件组成&#xff1a; 部署步骤&#xff1a;&#xff08;单台部署&#xff09; 环境部署&#xff1a; 安装JAVA环境&#xff1a;&#…

数据库系统概述——第十章 数据库恢复技术(知识点复习+练习题)

&#x1f31f;博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&am…

单页面应用是什么?优缺点?如何弥补缺点

文章目录 导文单页面应用是什么&#xff1f;优点&#xff1a;缺点&#xff1a;弥补缺点的方法&#xff1a; 导文 Web单页应用就是指只有一个Web页面作为入口的应用 在浏览器中运行期间不会重新加载页面。也就是说浏览器一开始会加载它必需的thml、css和js 之后所有的交互操作都…

Godot 4 源码分析 - 命令行参数

粗看Godot 4的源码&#xff0c;稍微调试一下&#xff0c;发现一大堆的命令行参数。在widechar_main中 Error err Main::setup(argv_utf8[0], argc - 1, &argv_utf8[1]); Main::setup中&#xff0c;各命令行参数加入到List<Stirng> args中&#xff0c;并通过OS::get…