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。