目录
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博客