当前位置: 首页 > news >正文

更多 QVariant 使用案例

以下是 QVariant 的其他典型应用场景及代码示例,涵盖更多实际开发需求:


6. 数据库查询结果处理

处理数据库字段的异构数据类型(如整数、字符串、日期等):

QSqlQuery query;
query.exec("SELECT name, age, created_at FROM users");
while (query.next()) {QString name = query.value(0).toString();    // 字符串字段int age = query.value(1).toInt();            // 整数字段QDateTime date = query.value(2).toDateTime(); // 日期字段qDebug() << name << age << date.toString();
}

说明QSqlQuery::value() 返回 QVariant,直接处理不同字段类型。


7. 动态创建 GUI 控件属性

批量设置控件属性时处理多类型值:

// 动态设置多个控件的属性
QList<QWidget*> widgets = {ui->lineEdit, ui->pushButton, ui->label};
foreach (QWidget* widget, widgets) {widget->setProperty("fontSize", QVariant(12));        // 整数widget->setProperty("highlightColor", QColor(Qt::yellow)); // 颜色widget->setProperty("tooltip", "Click here!");        // 字符串
}// 读取属性
QColor color = ui->label->property("highlightColor").value<QColor>();

8. 通用数据容器(QVariantMap/QVariantList)

构建动态数据结构,类似 JSON 对象或数组:

QVariantMap userData;
userData["id"] = 1001;
userData["name"] = "Charlie";
userData["scores"] = QVariantList{90, 85, 95}; // 嵌套列表// 序列化为 JSON
QJsonDocument doc = QJsonDocument::fromVariant(userData);
QByteArray json = doc.toJson();// 从 JSON 反序列化
QVariantMap parsedData = QJsonDocument::fromJson(json).toVariant().toMap();
qDebug() << parsedData["scores"].toList(); // 输出: QVariantList(90, 85, 95)

9. 跨线程传递复杂数据

在信号槽中传递动态类型数据(需注册元类型):

// 自定义数据结构
struct TaskResult {int code;QString message;
};
Q_DECLARE_METATYPE(TaskResult)// 在线程类中发射信号
void WorkerThread::run() {TaskResult result{200, "Success"};emit taskCompleted(QVariant::fromValue(result));
}// 主线程接收数据
void MainWindow::onTaskCompleted(const QVariant &result) {if (result.canConvert<TaskResult>()) {TaskResult data = result.value<TaskResult>();qDebug() << data.code << data.message; // 输出: 200 "Success"}
}

10. 插件或扩展系统接口

统一插件接口参数和返回值:

// 插件接口定义(抽象类)
class PluginInterface {
public:virtual QVariant executeCommand(const QString &cmd, const QVariantMap &args) = 0;
};// 具体插件实现
class CalculatorPlugin : public PluginInterface {
public:QVariant executeCommand(const QString &cmd, const QVariantMap &args) override {if (cmd == "add") {double a = args["a"].toDouble();double b = args["b"].toDouble();return QVariant(a + b);}return QVariant();}
};// 使用插件
PluginInterface* plugin = loadPlugin("calculator");
QVariant result = plugin->executeCommand("add", {{"a", 5}, {"b", 3}});
qDebug() << result.toDouble(); // 输出: 8.0

11. 游戏开发中的动态属性

管理游戏实体的可变属性(如血量、速度、状态):

class GameEntity {
public:void setAttribute(const QString &key, const QVariant &value) {m_attributes[key] = value;}QVariant getAttribute(const QString &key) const {return m_attributes.value(key);}private:QMap<QString, QVariant> m_attributes;
};// 使用示例
GameEntity player;
player.setAttribute("health", 100);
player.setAttribute("speed", 2.5);
player.setAttribute("isInvincible", false);// 战斗逻辑中修改属性
int damage = 20;
int newHealth = player.getAttribute("health").toInt() - damage;
player.setAttribute("health", newHealth);

12. 动态解析网络请求参数

处理 REST API 中的多类型请求参数:

// 解析 HTTP 请求中的查询参数
void handleRequest(const QMap<QString, QVariant> ¶ms) {int userId = params["user_id"].toInt();QString action = params["action"].toString();bool isAdmin = params.value("is_admin", false).toBool();if (action == "delete" && !isAdmin) {sendError("Permission denied");return;}// 执行操作...
}// 模拟请求参数
QMap<QString, QVariant> requestParams;
requestParams["user_id"] = 42;
requestParams["action"] = "delete";
requestParams["is_admin"] = true;
handleRequest(requestParams);

总结表格

场景关键点代码示例
数据库操作处理异构字段类型query.value(0).toString()
动态 GUI 属性批量设置控件属性setProperty("fontSize", 12)
通用数据容器类似 JSON 的嵌套结构QVariantMapQVariantList
跨线程数据传递结合元类型传递复杂对象QVariant::fromValue(result)
插件系统统一接口参数和返回值executeCommand 返回 QVariant
游戏属性管理动态实体状态管理setAttribute("health", 100)
网络请求参数解析多类型 HTTP 参数params["user_id"].toInt()

何时避免使用 QVariant?

尽管 QVariant 灵活性高,但在以下场景需谨慎:

  1. 性能敏感代码:频繁的类型转换和内存分配可能影响性能。
  2. 强类型需求:若数据类型严格固定,优先使用具体类型(如 intQString)。
  3. 代码可读性:过度使用 QVariant 可能降低代码可维护性。

QVariant 的核心理念是灵活处理未知或动态类型,在需要统一接口、动态配置或跨模块通信时,它是 Qt 生态中的关键工具。

相关文章:

  • Python序列Day3
  • 如何对 Oracle 日志文件进行校验
  • 钯铂贵金属分离回收树脂
  • Nginx 配置多个监听端口
  • obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
  • 编程题 02-线性结构2 一元多项式的乘法与加法运算【PAT】
  • PostgreSQL 的 pg_current_logfile 函数
  • 【Ubuntu】Netplan静态网络配置
  • 缺乏实体人形机器人的主流高精度仿真方案
  • Flutter接入ProtoBuff和原生Android通信【性能最优】
  • tmux 入门与实用指南
  • 39、.NET GC是什么? 为什么需要GC?
  • 深泽多层电路在PCB行业中属于什么水平
  • 初识Linux · 传输层协议TCP · 上
  • Python爬虫中time.sleep()与动态加载的配合使用
  • C语言自定义类型:联合与枚举详解
  • 手撕基于AMQP协议的简易消息队列-2(所用第三方库的介绍与简单使用)
  • 【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南
  • 【SpringMVC】详解cookie,session及实战
  • ping_test_parallel.sh 并行网络扫描脚本
  • 七方面118项任务,2025年知识产权强国建设推进计划印发
  • 不主动上门检查,上海已制定14个细分领域“企业白名单”甄别规则
  • 吴清:推动公募基金高质量发展的行动方案今天将会发布
  • 一揽子十条货币政策措施出炉:降准降息,设立五千亿服务消费与养老再贷款
  • 商务部新闻发言人就中美经贸高层会谈答记者问
  • “五一”假期文旅热度创近3年新高,入境游订单飙升130%