QVariant类及数据的存与取

博客介绍了Qt的QVariant类型,它可存放多种类型数据,使用对应to函数取出,放入和取出类型须对应。其数据核心包含union和标记类型的type,能保存多种Qt和C++类型及集合类型,还给出基本数据类型、QIcon等类、自定义结构体的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试想我们的 table单元格可以是string,也可以是int,也可以是一个颜色值,那么这么多类型怎么返回呢?

于是,Qt提供了这个QVariant类型,你可以把这很多类型都存放进去,到需要使用的时候使用一系列的to函数取出来即可。比如你把int包装成一个QVariant,使用的时候要用 QVariant::toInt()重新取出来。这里需要注意的是,QVariant类型的放入和取出必须是相对应的,你放入一个int就必须按int取出,不能用toString(), Qt不会帮你自动转换。
数据核心无非就是一个 union,和一个标记类型的type:传递的是整数 123,那么它union存储整数123,同时type标志Int;如果传递字符串,union存储字符串的指针,同时type标志QString。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QDateTime、QPixmap、QPoint和QString,并且还有C++基本类型,如 int、float等。QVariant还能保存很多集合类型,如QMap<QString, QVariant>, QStringList和QList。item view classes,数据库模块和QSettings都大量使用了QVariant类,以方便我们读写数据。

示例:

    1.基本数据类型使用
    int

    QVariant var;
    var.setValue(123); //存
    int nvar ;
    nvar = var.value<int>();//取
    QString
    QVariant var2;
    var2.setValue(QString("world"));//存
    QString strValue;
    strValue = var2.value<QString>();//取
    2.QIcon等类使用
     QIcon icon("open.png");
     QVariant var3 = icon;        //存
     QIcon iconValue = var3.value<QIcon>();//取
    3.自定义结构体使用
    struct flyData
    {
        int id;
        QString name;
    };
    Q_DECLARE_METATYPE(flyData);//重点

    void xvalidator::slotSend()
    {
        flyData temp;
        temp.id = 1;
        temp.name = "test";
        QVariant data;
        data.setValue(temp);  //保存数据
        Receive( data);
    }

  void xvalidator::Receive(QVariant data)
   {
      flyData da = data.value<flyData>();    //获取数据
   }

数据库操作中,QVariant 是一个非常有用的,特别是在使用 Qt 框架时。QVariant 可以储多种型的值,如整数、浮点数、字符串、日期等。这使得它在处理数据库记录时非常方便,因为数据库中的字段型可能多种多样。 以下是如何使用 QVariant 进行数据库操作的几个步骤: 1. **数据**:在将数据插入数据库之前,可以将数据储在 QVariant 对象中。 2. **读数据**:从数据库中读数据后,可以将数据储在 QVariant 对象中,然后根据需要转换为相应的型。 ### 示例代码 ```cpp #include <QtSql> #include <QVariant> #include <QDebug> bool insertData(const QString &name, int age, const QDate &birthdate) { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("example.db"); if (!db.open()) { qDebug() << "Cannot open database:" << db.lastError(); return false; } QSqlQuery query; query.prepare("INSERT INTO person (name, age, birthdate) VALUES (:name, :age, :birthdate)"); query.bindValue(":name", name); query.bindValue(":age", QVariant(age)); query.bindValue(":birthdate", QVariant(birthdate)); if (!query.exec()) { qDebug() << "Error inserting data:" << query.lastError(); return false; } return true; } bool readData() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("example.db"); if (!db.open()) { qDebug() << "Cannot open database:" << db.lastError(); return false; } QSqlQuery query("SELECT name, age, birthdate FROM person"); while (query.next()) { QString name = query.value(0).toString(); int age = query.value(1).toInt(); QDate birthdate = query.value(2).toDate(); qDebug() << "Name:" << name << "Age:" << age << "Birthdate:" << birthdate.toString(); } return true; } int main(int argc, char *argv[]) { insertData("Alice", 30, QDate(1990, 1, 1)); readData(); return 0; } ``` ### 解释 1. **插入数据**:使用 `QSqlQuery::prepare` 和 `QSqlQuery::bindValue` 方法将数据绑定到 SQL 语句中。`QVariant` 用于储不同型的数据。 2. **读数据**:使用 `QSqlQuery::next` 方法逐行读数据,并通过 `QVariant::toString`, `QVariant::toInt` 和 `QVariant::toDate` 方法将数据转换为相应的型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值