QVariant
QVariant 类本质为 C++联合(Union)数据类型,它可以保存很多Qt 类型的值,包括 QBrush、QColor、QString 等等。也能够存放Qt 的容器类型的值。
QVariant::StringList 是 Qt 定义的一个 QVariant::type 枚举类型的变量,其他常用的枚举类型变量如下表所示:
变量 | 对应的类型 | 变量 | 对应的类型 |
QVariant::Invalid | 无效类型 | QVariant::Time | QTime |
QVariant::Region | QRegion | QVariant::Line | QLine |
QVariant::Bitmap | QBitmap | QVariant::Palette | QPalette |
QVariant::Bool | bool | QVariant::List | QList |
QVariant::Brush | QBrush | QVariant::SizePolicy | QSizePolicy |
QVariant::Size | QSize | QVariant::String | QString |
QVariant::Char | QChar | QVariant::Map | QMap |
QVariant::Color | QColor | QVariant::StringList | QStringList |
QVariant::Cursor | QCursor | QVariant::Point | QPoint |
QVariant::Date | QDate | QVariant::Pen | QPen |
QVariant::DateTime | QDateTime | QVariant::Pixmap | QPixmap |
QVariant::Double | double | QVariant::Rect | QRect |
QVariant::Font | QFont | QVariant::lmage | Qlmage |
QVariant.:Icon | QIcon | QVariant::UserType | 用户自定义类型 |
案例分析:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// 定义学生结构体类型
struct student
{
int iNo;
QString strName;
int score;
};
Q_DECLARE_METATYPE(student)
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
// w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include <QVariant>
#include <QDebug>
#include <QColor>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QVariant qv1(666);
qDebug()<<"qv1:"<<qv1.toInt();
QVariant qv2("zgl nb");
qDebug()<<"qv2:"<<qv2.toString();
QMap<QString,QVariant> qmap;
qDebug()<<endl;
qmap["int"]=20000; // 整型
qmap["double"]=99.88; // 浮点型
qmap["string"]="Good"; // 字符串
qmap["color"]=QColor(255,255,0); // QColor类型
// 输出:转换函数来处理
qDebug()<<qmap["int"]<<qmap["int"].toInt();
qDebug()<<qmap["double"]<<qmap["double"].toDouble();
qDebug()<<qmap["string"]<<qmap["string"].toString();
qDebug()<<qmap["color"]<<qmap["color"].value<QColor>();
// 创建一个字符串列表:QStringList
qDebug()<<endl;
QStringList qsl;
qsl<<"A"<<"B"<<"C"<<"D"<<"E"<<"F";
QVariant qvsl(qsl); // 将列表存储在一个QVariant变量
if(qvsl.type()==QVariant::StringList)
{
QStringList qlist=qvsl.toStringList();
for (int i=0;i<qlist.size();i++) {
qDebug()<<qlist.at(i); // 输出列表数据信息
}
}
// 结构体类型和QVariant类配合使用
qDebug()<<endl;
student stu;
stu.iNo=202201;
stu.strName="sunny";
stu.score=715;
// 使用静态方法保存数据
QVariant qstu=QVariant::fromValue(stu);
if(qstu.canConvert<student>()) // 判断是否可以转换操作
{
student temp=qstu.value<student>(); // 获取数据
student qtemp=qvariant_cast<student>(qstu); // 获取数据
qDebug()<<"student:iNo="<<temp.iNo<<",strName="<<temp.strName<<",score="<<temp.score;
qDebug()<<"student:iNo="<<qtemp.iNo<<",strName="<<qtemp.strName<<",score="<<qtemp.score;
}
}
MainWindow::~MainWindow()
{
}
编译执行结果:
Q_DECLARE_METATYPE说明
在使用Qt进行应用程序开发时,经常要自定义数据类型,而且在需要的时候还要把这些数据放到QVariant中去。因为QVariant是一个接受绝大部分类型的数据类型。为了达到这个目的,就必须使用Q_DECLARE_METATYPE。
Q_DECLARE_METATYPE是一个宏定义,用于在Qt元对象系统中注册自定义类型。它的作用是将用户定义的类型转换为Qt中的QVariant类型,使其能够用于信号槽的传递和存储。
使用方法是在需要注册的类型前加上Q_DECLARE_METATYPE宏定义,并在应用程序中调用qRegisterMetaType()函数进行注册。
例如,下面是一个自定义的Person类:
class Person {
public:
QString name;
int age;
};
为了在Qt中使用该类型,需要添加如下宏定义:
Q_DECLARE_METATYPE(Person)
然后在应用程序中调用qRegisterMetaType()函数进行注册:
qRegisterMetaType<Person>("Person");
这样就能在Qt中使用Person类,并将其作为参数传递到信号槽中。
下面以一段简单的代码说明Q_DECLARE_METATYPE的用法和注意点。
#include <QtGui/QApplication>
#include <QVariant>
struct struct1
{
int a;
double b;
};
struct struct2
{
struct1 s;
int c;
};
Q_DECLARE_METATYPE(struct1) //struct1与struct2 谁先谁后,没有影响
Q_DECLARE_METATYPE(struct2)
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
struct1 v1 = {1, 2.0};
QVariant var1;
var1.setValue(v1);
if (var1.canConvert<struct1>()) //判断能否转化为相应类型
{
struct1 v11 = var1.value<struct1>();
}
struct2 v2 = {{2, 3.0}, 5};
QVariant var2;
if (var2.canConvert<struct2>())
{
var2.setValue(v2);
struct2 v22 = var2.value<struct2>();
}
return a.exec();
}
通过Q_DECLARE_METATYPE声明后,就可以让自定义的类型设置到QVariant。