QVariant类 (**)

目录

QVariant类


QT中的QVariant类型-万能变量:自定义的数据类型,保存指针

Qt6之万能数据类型QVariant详解

QVariant类详解 (用法***)

万能数据类型QVariant类 (原理***)

使用QVariant存储自定义类型 (**)

QVariant使用type()获取变量中值的返回类型

----------------------------------------------------------

参考:

QVariant 存取任意类型的指针 、自定义数据类型
https://blog.csdn.net/ken2232/article/details/131733264

QVariant类
https://blog.csdn.net/ken2232/article/details/131732801

Qt 子对象引用mainwindow指针的巧妙方法 (***)
https://blog.csdn.net/ken2232/article/details/129638483


Qt里通过传递函数指针实现动态绑定信号/槽 (**)
https://blog.csdn.net/ken2232/article/details/131566404

----------------------------------------------------

----------------------------------------------------------

QVariant类Qt共用体union数据类型,不仅能保存很多Qt类型的值,包括QColor,QBrush,QFont,QRect,QString及QSize等等,而且能存放Qt的容器类型值。

QVariant非常的灵活既能支持已有类型还能支持自定义类型,但任意类型的任意复杂数据结构意味着性能效率的让步。

疑问:

1. Qt 内部许多不同的数据,都使用了 QVariant类,因此,性能和效率的损失,应该是控制在可以接收的范围吧?

2. Qt 6 新增了 QVariantPointer Class。因此,当前而言,使用 QVariantPointer应该会是一个趋势?

QVariant类的常用函数有:

bool isNull();              //判断数据项是否为空
bool isValid();             //判断是否为QVariant类对象
void setValue();          //设置QVariant类对象的值
Type type();                //返回QVariant类数据项的类型
const char* typeName();     //返回QVariant类数据项的类型
T value();                  //返回数据项的值,注意这是一个函数模板,使用该函数时需要指定T的具体类型

==================================

QVariant使用type()获取变量中值的返回类型

众所周知,Q的Variant类能够保存很多Qt中值,这里不是要分享怎样保存值,是想记录一下这种使用方式:
Variant::type()返回存储在Variant变量中的值的类型。

   QVariant test1(1),test2(0.5),test3("hello Q");
   qDebug()<<test1.type() << test2.type() << test3.type();
   if(test1.type() == QVariant::Int)
       qDebug()<<"奥利给";

打印结果:
QVariant::int QVariant::double QVariant::QString
奥利给
啊 哈

————————————————
版权声明:本文为CSDN博主「啊 哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44864066/article/details/107800895

使用QVariant存储自定义类型 (**)

https://blog.csdn.net/caoshangpa/article/details/76576005
 

QVariant类详解 (用法***)

概要:本期主要讲解Qt中QVariant类的常用接口。

一、简介:

1.头文件:#include<QVariant>
2.模块: QT += core
3.功能:最多的用法是将其作为中间转换类,进行不同数据类型或者Qt容器类之间的类型转换。它具有这种功能的原因是,QVatiant是所有QMetaType内置声明的数据类型和Qt容器类的联合(Union)。总之,在Qt中我们可以简单地认为它是一种万能类型类,我们只要借用它来进行类型转换就可以了。

二、常用接口:

1.初始化、赋值

//使用QVariant类的构造函数进行初始化
QVariant _var = QVariant("789");
QVariant _var = "789";

 
//赋值一般也使用构造函数来实现
_var = QVariant(789);
//存在使用tovariant()的情况,暂时不做介绍

2.是否可以转换

//canConvert<T>()
QVariant _var = 43;
bool _bIs = _var.canConvert<int>();  //_bIs = true
_bis = _var.caConvert<QString>();  //_bIs = true

3.清空

//clear()清空操作
QVariant _var = 43;
_var.clear();

4.注册自定义类型的使用(存值、取值)

//不作详细讲解,我没怎么用过
//1.自定义类型,
//2..再声明注册类型 Q_DECLARE_METATYPE(T)
//3.存值:[static] QVariant QVariant::fromValue<T>()  或者void setValue<T>();
//4.取值:T QVariant::value<T>();

5.是否为QmetaType数据类型

//isValid()
QVariant _var = 43;
bool _bIs = _var.isValid();  //_bIs = true;

结尾:本期的主要内容就是这些,至于QVariant与数据类型之间的转换,大部分可以用 to+数据类型()这样的接口,来实现类型转换。然后,我们下期学习QVector类的用法。
————————————————
版权声明:本文为CSDN博主「努力学技术的水果店老板」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wddkxg/article/details/129052262

QT中的QVariant类型-万能变量

自定义的数据类型,保存指针

转自:QVariant的用法_十年之少的博客-CSDN博客

前言

QVariant这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。

 
介绍

帮助文档上说:The QVariant class acts like a union for the most common Qt data types.。

QVariant 这个类型充当着最常见的数据类型的联合。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。

当然,如果支持的类型没有想要的,没关系,QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:

Q_DECLARE_METATYPE(MyClass)

 
示例

(1)支持的类型,对于QVariant支持的类型,可直接赋值,但是取值时,对于存入的是什么类型,取出也要为这个类型。如存入为int类型,输出为toString()

    QVariant var;
    var.setValue(12);
    int data=var.toInt();

    QVariant var=12;
    int data=var.toInt();

(2)对于不支持的类型,如自己定义的结构体。由于Qt都是基于元对象系统,故要在头文件里面要注册此类属于元类型。存储用到了QVariant QVariant::fromValue(const T &value) 或 void QVariant::setValue(const T &value)。获取用到了

T QVariant::value() const,在这之前一般要bool QVariant::canConvert(int targetTypeId) const先用进行判断,是否可以转换。例子如下:

.h文件声明

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

.cpp文件定义

//存储数据
    MyClass myClass;
    myClass.id=0;
    myClass.name=QString("LiMing");

    data[0]=QString("ddd");
    data[1]=123;
    data[3]=QVariant::fromValue(myClass);


//获取数据
    QString str=data.value(0).toString();
    int val=data.value(1).toInt();

    if(data[3].canConvert<MyClass>())
    {
        MyClass myClass=data[3].value<MyClass>();
        int id=myClass.id;
        QString name=myClass.name;
    }

(3)保存指针,感觉这个比较强大,也比较容易用到。如

    //保存
    QVariant var=QVariant::fromValue((void*)event);
    
    //获取
    QPaintEvent* e=(QPaintEvent*)var.value<void*>();

QVariant类

    QVariant类
        demo
            三级目录

QVariant类

QVariant类是Qt的共用体union数据类型,不仅能保存很多Qt类型的值,包括QColor,QBrush,QFont,QRect,QString及QSize等等,而且能存放Qt的容器类型值。
可采用toT()将QVariant对象转换称为T类型并获取其值。如toInt(),toFloat(),toString(),可用type方法获取数据类型,判断数据是否可。

对于GUI模块中定义的数据类型没有相应的转换函数,即没有toColor(),没有toImage()这样的函数提供,可通过value()方法实现转换,判断两种类型是否可以转换时可通过canConvert()方法的返回值判断。

demo

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QDebug>
#include <QTimer>
#include <QApplication>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QVariant vNum(100);
    qDebug() << vNum.toInt();

    QVariant vPI(3.1415f);
    qDebug() << vPI.toFloat();

    QVariant vStr("Hello!");
    qDebug() << vStr.toString();

                 

    QVariant vb(true);
    qDebug() << vb.toBool();

    QColor c = QColor(Qt::red);
    QVariant vC = c;
    qDebug() << vC.type();
    qDebug() << vC.value<QColor>();

         

    QVariant vss = vStr;

    //返回数据类型转换的能力
    qDebug() << vss.canConvert(QVariant::Int);
    qDebug() << vss.toString();

  

    //转换成功的条件:有转换能力,数据类型匹配
    qDebug() << vss.convert(QVariant::Int);
    qDebug() << vss.toString();

    

    //退出应用程序
    QTimer::singleShot(0,qApp,SLOT(quit()));
}

Widget::~Widget()
{

}


 

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
//    w.show();

    return a.exec();
}


————————————————
版权声明:本文为CSDN博主「Respect@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46376834/article/details/119648766

Qt6之万能数据类型QVariant详解

https://blog.csdn.net/yanchenyu365/article/details/130721388

 二、QVariant支持常见类型

注意:Type type(),已经在qt6中被移除,*.type()已经无法使用,可用*.typeName()输出类型名称;

它几乎支持常见的qt中所有类型,在使用过程中就可以轻松的保存很多类型的值,有点类似盒子,尽管放就行。

 总结,

QVariant非常的灵活既能支持已有类型还能支持自定义类型,但任意类型的任意复杂数据结构意味着性能和效率的让步。

万能数据类型QVariant类 (原理***)

前面学习了Qt中的模型-视图,在模型中有一个常用的模型类,通用模型类QStandardItemModel,它是既支持表格形式存放数据项,又支持树形存放数据项的模型,在日常开发中比较常用。在讲解QVariant类之前,先来看看通用模型类QStandardItemModel。
1. 通用模型类QStandardItemModel

作为一个通用模型类,QStandardItemModel能够以任意方式(线性/非线性)组织数据,数据组织的基本单位为数据项QStandarItem,每个数据项能够存储多个具体的数据,需要使用数据角色来设置这多个数据(不然视图无法知道数据如何显示),每个数据项可以对数据状态进行设置,如可编辑、可选。QStandardItemModelQStandardItemModel在项目中的角色大抵如此:

QStandardItemModel继承自QAbstractItemModel类,QStandardItemModel类内有两个重要类:表示数据项的QStandardItem和对数据项进行索引使用的QModelIndex。QStandardItemModel作为一个模型类,它可供视图存取数据。
2. 万能数据类型QVariant类

在前面讲过,索引接口定义在QAbstractItemModel类中,它是一个虚函数:

virtual QModelIndex index(int row,int column, const QModelIndex &parent = QModelIndex()) const = 0;

它的返回值类型为QVariant类,那么上补充上图为:

通用模型类中存储的数据项的数据类型可能double、QString、int等常见的数据类型,那么index()函数的返回值大可以是一个联合体?

其实不然,因为c++禁止联合体中包含有非默认的构造函数和析构函数的类型,也就是说许多继承的Qt类不能在联合体中使用,如QString(关于联合体和类的配合使用在文章http://blog.csdn.net/qq_29344757/article/details/78060189有介绍)。这就需要引入跟联合体功能类似的QVariant类。

QVariant类的常用函数有:

bool isNull();              //判断数据项是否为空
bool isValid();             //判断是否为QVariant类对象
void setValue();          //设置QVariant类对象的值
Type type();                //返回QVariant类数据项的类型
const char* typeName();     //返回QVariant类数据项的类型
T value();                  //返回数据项的值,注意这是一个函数模板,使用该函数时需要指定T的具体类型

QVariant类的使用,

可参照下面代码片段:

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

    QVariant v1(6);
    qDebug() << v1.type();      //QVariant::in
    qDebug() << v1.typeName();  //int
    qDebug() << v1.toInt();     //6

    qDebug() << endl;

    QVariant v2(0.618);
    qDebug() << v2.type();          //QVariant::double  
    qDebug() << v2.typeName();      //double
    qDebug() << v2.toInt();         //1
    qDebug() << v2.toDouble();      //0.618
    qDebug() << v2.value<double>(); //0.618

    qDebug() << endl;

    QVariant v3("456");             
    qDebug() << v3.type();              //QVariant::QString
    qDebug() << v3.typeName();          //QString
    qDebug() << v3.toInt();             //456
    qDebug() << v3.value<QString>();    //"456"

    qDebug() << endl;

    QVariant v4(QPoint(16, 16));
    bool ok = true;
    qDebug() << v4.type();              //QVariant::QPoint
    qDebug() << v4.typeName();          //QPoint
    qDebug() << v4.toInt(&ok);          //0
    qDebug() << ok;                     //false,QPoint转换为int类型肯定失败
    qDebug() << v4.toPoint();           //QPoint(16,16)

    qDebug() << endl;

    QVariant v5;
    qDebug() << v5.isValid();           //false,v5没有设置值

    return a.exec();
}

要为QVariant增加程序员自定义的类型,需要先注册,如:

class hello{
public:
    int a;
    char c;
};

Q_DECLARE_METATYPE(hello)

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

    hello h;
    h.a = 12;
    h.c = 'c';

    QVariant v3;
    v3.setValue(h);

    qDebug() << v3.type();          //QVariant::UserType
    qDebug() << v3.typeName();      //hello
}

————————————————
版权声明:本文为CSDN博主「mybright_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29344757/article/details/78061417

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值