QVariant

本文介绍了QVariant在Qt中的应用,包括使用构造函数和setValue函数设置标准类型数据,以及如何将QVariant对象转换回实际的数据类型。同时,讨论了如何使自定义类型兼容QVariant,通过Q_DECLARE_METATYPE宏进行注册,并展示了读写自定义类型数据的例子。
摘要由CSDN通过智能技术生成

标准类型

构造函数

// 这类转换需要使用QVariant类的构造函数, 由于比较多, 大家可自行查阅Qt帮助文档, 在这里简单写几个
QVariant::QVariant(int val);
QVariant::QVariant(bool val);
QVariant::QVariant(double val);
QVariant::QVariant(const char *val);
QVariant::QVariant(const QByteArray &val);
QVariant::QVariant(const QString &val);
......

例子:

    QVariant a1(11);
    qDebug()<<a1.type();
    QVariant a2(true);
    qDebug()<<a2.type();
    QVariant a3(11.11);
    qDebug()<<a3.type();
    QVariant a4("hello");
    qDebug()<<a4.type();
    QByteArray b1("11");
    QString b2("22");
    QVariant a5(b1);
    qDebug()<<a5.type();
    QVariant a6(b2);
    qDebug()<<a6.type();

在这里插入图片描述

将支持的类型的数据设置到QVariant对象中

// 使用设置函数也可以将支持的类型的数据设置到QVariant对象中
// 这里的 T 类型, 就是QVariant支持的类型
void QVariant::setValue(const T &value);
// 该函数行为和 setValue() 函数完全相同
[static] QVariant QVariant::fromValue(const T &value);

例子:

	QVariant v1;
    v1.setValue(5.5);
    QVariant v2 = QVariant::fromValue(1.1);
    qDebug()<<v1.type();
    qDebug()<<v2.type();

在这里插入图片描述

将QVariant对象转换为实际的数据类型

// 如果要实现该操作, 可以使用QVariant类提供的 toxxx() 方法, 全部转换可以参考Qt帮助文档
// 在此举列举几个常用函数:
bool QVariant::toBool() const;
QByteArray QVariant::toByteArray() const;
double QVariant::toDouble(bool *ok = Q_NULLPTR) const;
float QVariant::toFloat(bool *ok = Q_NULLPTR) const;
int QVariant::toInt(bool *ok = Q_NULLPTR) const;
QString QVariant::toString() const;
	QVariant a1(11);
    QVariant a2(true);
    QVariant a3(11.11);
    QVariant a4("hello");
    
    int i1 = a1.toUInt();
    bool i2 = a2.toBool();
    float i3 = a3.toFloat();
    QString i4 = a4.toString();
    qDebug()<<i1<<" "<<i2<<" "<<i3<<" "<<i4;

在这里插入图片描述

例子:
在这里插入图片描述
在这里插入图片描述

#include "qvariant2.h"
#include "ui_qvariant2.h"
#include "QDebug"
#include "QtCore"
#include "QtGlobal"
#include <iostream>
#include<QVariant>
using namespace std;

QVariant2::QVariant2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QVariant2)
{
    ui->setupUi(this);
    QVariant a = "aa";
    QVariant b = "bb";
    qDebug()<<this->dataPlus(a,b);
    qDebug()<<this->dataPlus(11,22);
    
}

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

QVariant QVariant2::dataPlus(QVariant a, QVariant b)
{
    QVariant result;
    //先判断类型,按照不同的类型执行不同的加法运算
    if(a.type()==QVariant::Int&&b.type()==QVariant::Int){
        result = QVariant(a.toInt()+b.toInt());
    }else if(a.type()==QVariant::String&&b.type()==QVariant::String){
        result = QVariant(a.toString().append(b.toString()));
    }else{
        cout<<"数据类型不匹配"<<endl;
    }
    return result;

}

在这里插入图片描述

自定义类型

我们自定义的类型也可以使用QVariant类进行封装, 被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数

首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面, 原型为:

Q_DECLARE_METATYPE(Type)
// 如果当前QVariant对象可用转换为对应的模板类型 T, 返回true, 否则返回false
bool QVariant::canConvert() const;
// 将当前QVariant对象转换为实际的 T 类型
T QVariant::value() const;

第一步: 在头文件中声明

在这里插入图片描述

// *.h
struct Student
{
    int id;
    QString name;
};
// 自定义类型注册
Q_DECLARE_METATYPE(Student)

第二步: 在源文件中定义

在这里插入图片描述

#include "qvariant3.h"
#include "ui_qvariant3.h"
#include "QDebug"
#include "QtCore"
#include "QtGlobal"
#include <iostream>
#include<QVariant>
using namespace std;


QVariant3::QVariant3(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QVariant3)
{
    ui->setupUi(this);
    this->showStudent();

}

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

//展示结构体的值的成员函数
void QVariant3::showStudent()
{
    Student t;
    t.name = "张三丰";
    t.id = 666;
    // 值的封装
    QVariant vt = QVariant::fromValue(t);

    // 值的读取
    if(vt.canConvert<Student>())
    {
        Student t = vt.value<Student>();
        qDebug() << "name: " << t.name << ", num: " << t.id;
    }
}

调用函数
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值