目录
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这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而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_OBJECTpublic:
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(); //6qDebug() << 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.618qDebug() << 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