Qt与C++数据类型转换

本文深入探讨Qt与C++中相似但不同的数据类型处理技巧。

一、QString与std::string的相互转换

1. QString → std::string

方法1:使用toStdString()(推荐)
QString qstr = "你好,Qt世界";
std::string str = qstr.toStdString();
方法2:通过QByteArray中转
QString qstr = "Hello Qt";
std::string str = qstr.toUtf8().constData();

注意事项

  • 中文等非ASCII字符建议使用toUtf8()
  • 简单英文文本可使用toLatin1()

2. std::string → QString

方法1:使用fromStdString()(推荐)
std::string str = "Hello from C++";
QString qstr = QString::fromStdString(str);
方法2:直接构造
std::string str = "Direct construction";
QString qstr(str.c_str());

编码处理

// 处理特殊编码
std::string gbkStr = getGBKString(); // 假设获取GBK编码字符串
QString qstr = QString::fromLocal8Bit(gbkStr.c_str());

二、其他常用数据类型转换

1. 数值类型转换

C++风格 → Qt风格
int num = 42;
QString qNumStr = QString::number(num);double pi = 3.14159;
QString qPiStr = QString::number(pi, 'f', 2); // 保留2位小数
Qt风格 → C++风格
QString qNumStr = "1024";
bool ok;
int num = qNumStr.toInt(&ok); // ok检测转换是否成功QString qDoubleStr = "3.14";
double val = qDoubleStr.toDouble();

2. 容器类型转换

std::vector ↔ QList
// std::vector → QList
std::vector<int> vec = {1, 2, 3};
QList<int> qList = QList<int>::fromVector(QVector<int>(vec.begin(), vec.end()));// QList → std::vector
QList<QString> qStrList = {"a", "b", "c"};
std::vector<std::string> stdVec;
for (const auto& item : qStrList) {stdVec.push_back(item.toStdString());
}
std::map ↔ QMap
// std::map → QMap
std::map<int, std::string> stdMap = {{1, "one"}, {2, "two"}};
QMap<int, QString> qMap;
for (const auto& pair : stdMap) {qMap.insert(pair.first, QString::fromStdString(pair.second));
}// QMap → std::map
QMap<QString, int> qMap = {{"a", 1}, {"b", 2}};
std::map<std::string, int> stdMap;
for (auto it = qMap.begin(); it != qMap.end(); ++it) {stdMap[it.key().toStdString()] = it.value();
}

3. 时间类型转换

std::chrono ↔ QDateTime
// std::chrono → QDateTime
auto now = std::chrono::system_clock::now();
time_t time = std::chrono::system_clock::to_time_t(now);
QDateTime qDateTime = QDateTime::fromSecsSinceEpoch(time);// QDateTime → std::chrono
QDateTime qNow = QDateTime::currentDateTime();
auto stdTimePoint = std::chrono::system_clock::from_time_t(qNow.toSecsSinceEpoch());

三、Qt特有类型深度解析

1. QString的优势

  • Unicode支持:天然支持多语言文本
  • 隐式共享:拷贝时不会立即深拷贝,提高性能
  • 丰富API:提供字符串分割、格式化等便捷方法
QString str = "apple,orange,banana";
QStringList fruits = str.split(","); // 简单分割

2. QVariant的魔法

Qt的万能容器类型,可存储多种数据类型:

QVariant v1 = 42;            // 存储int
QVariant v2 = "Hello";       // 存储const char*
QVariant v3 = QDateTime::currentDateTime(); // 存储QDateTime// 取出数据
if (v1.canConvert<int>()) {int num = v1.toInt();
}

3. 信号槽与std::function

将C++11的lambda与Qt信号槽结合:

// 传统Qt连接
connect(button, &QPushButton::clicked, this, &MyClass::handleClick);// 使用lambda
connect(button, &QPushButton::clicked, [=](){qDebug() << "Button clicked with C++ lambda";
});// std::function转Qt槽
std::function<void()> func = [](){ /*...*/ };
QMetaObject::invokeMethod(this, [func]{ func(); });

四、最佳实践与陷阱规避

1. 编码问题解决方案

  • 统一使用UTF-8:在项目.pro文件中添加:
    DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII
    
  • 设置默认编码
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    

2. 性能优化技巧

  • 避免频繁转换:尽量在单一类型体系中处理数据
  • 使用QStringBuilder优化拼接
    #include <QStringBuilder>
    QString s1 = "Hello", s2 = "World";
    QString result = s1 % " " % s2; // 比"+"操作符更高效
    

3. 常见陷阱

  • 悬空指针问题
    // 错误示例
    const char* cstr = qstr.toLatin1().constData(); // 临时对象已销毁!// 正确做法
    QByteArray bytes = qstr.toLatin1();
    const char* cstr = bytes.constData();
    
  • 数值转换验证
    QString numStr = "123a";
    bool ok;
    int num = numStr.toInt(&ok);
    if (!ok) {// 处理转换失败
    }
    

五、实际应用示例

1. 配置文件读写

// 写入配置(Qt风格)
QSettings settings("config.ini", QSettings::IniFormat);
settings.setValue("username", QString::fromStdString(stdUsername));// 读取配置(C++风格)
std::string username = settings.value("username").toString().toStdString();

2. 网络数据传输

// 发送数据(混合使用)
QTcpSocket socket;
std::string stdData = getDataFromCppLib();
socket.write(QString::fromStdString(stdData).toUtf8());// 接收数据
connect(&socket, &QTcpSocket::readyRead, [&](){QByteArray data = socket.readAll();std::string stdData(data.constData(), data.length());processWithCppLib(stdData);
});

结语

掌握Qt与C++数据类型间的转换是跨框架开发的关键技能。记住:

  1. 优先使用Qt原生转换方法(如toStdString()
  2. 注意编码问题,特别是处理多语言文本时
  3. 了解两种类型系统的优势,在适当场景选择最佳方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/900655.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/900655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习+EEG熵进行双相情感障碍诊断的综合评估

摘要 双相情感障碍(BD)是一种常见的精神疾病&#xff0c;特点是躁狂或轻躁狂与抑郁交替发作&#xff0c;其严重程度各异&#xff0c;导致准确及时的诊断具有一定的挑战性。EEG的非线性特征被认为是精神障碍的生物标志物&#xff0c;能够反映大脑的非线性动态。尽管已有研究证明…

企业应用集成全析:架构、实践与展望

企业应用集成全析&#xff1a;架构、实践与展望 一、企业应用集成的基本概念1.1 定义1.2 目标 二、企业应用集成的层次架构2.1 数据集成2.2 应用系统集成2.3 业务流程集成​ 三、企业应用集成的关键技术3.1 中间件技术3.2 Web 服务技术​3.3 企业服务总线&#xff08;ESB&#…

【STL】list介绍(附与vector的比较)

文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…

SQL:DDL(数据定义语言)和DML(数据操作语言)

目录 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09; DDL和DML的区别 什么是SQL&#xff1f; SQL&#xff08;Structured …

Chrome 135 版本开发者工具(DevTools)更新内容

Chrome 135 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、性能&#xff08;Performance&#xff09;面板改进 1. 性能面板中的配置文件和函数调用现已显示来源和脚本链接 Performance > Summary&#xff08;性能 > 概览&#xff09;选项卡现在会显示配…

[ctfshow web入门] web23

前置知识 include&#xff1a;包含一个文件&#xff0c;也可以包含一些其他东西&#xff0c;后续用到再解析 substr&#xff1a;对字符串进行切片&#xff0c;第一个参数是字符串&#xff0c;第二第三个参数出从第a个索引开始切n个&#xff0c;索引从0开始计数。 例如&#xf…

vue3 开发电子地图功能

文章目录 一、项目背景二、页面效果三、代码1.ElectronicMap.vue2.TransferDeskRSSIMap.vue3.Map.js4.src/stores/index.js Vuex存储属性 四、注意点本人其他相关文章链接 一、项目背景 项目采用&#xff1a;vue3javaArco DesignSpringBootOpenStreetMap 数据的地图切片服务。…

oracle 存储体系结构

oracle 存储体系结构 参考&#xff1a; Logical Storage Structures (oracle.com)

python-leetcode 66.寻找旋转排序数组中的最小值

题目&#xff1a; 已知一个长度为n的数组&#xff0c;预先按照升序排列&#xff0c;经由1到n次旋转后&#xff0c;得到输入数组&#xff0c;例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若…

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法(有目标函数)

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法&#xff08;有目标函数&#xff09; 一、方法概述 扩展傅里叶幅度敏感性检验&#xff08;EFAST&#xff09;是一种基于频域分析的全局敏感性分析方法&#xff0c;能够同时评估模型参数的一阶敏感性&#xff…

Tiktok 关键字 视频及评论信息爬虫(1) [2025.04.07]

&#x1f64b;‍♀️Tiktok APP的基于关键字检索的视频及评论信息爬虫共分为两期&#xff0c;希望对大家有所帮助。 第一期见下文。 第二期&#xff1a;基于视频URL的评论信息爬取 1. Node.js环境配置 首先配置 JavaScript 运行环境&#xff08;如 Node.js&#xff09;&#x…

【愚公系列】《高效使用DeepSeek》058-选题策划

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

零基础教程:Windows电脑安装Linux系统(双系统/虚拟机)全攻略

一、安装方式选择 方案对比表 特性双系统安装虚拟机安装性能原生硬件性能依赖宿主机资源分配磁盘空间需要独立分区&#xff08;建议50GB&#xff09;动态分配&#xff08;默认20GB起&#xff09;内存占用独占全部内存需手动分配&#xff08;建议4GB&#xff09;启动方式开机选…

LeetCode 2968.执行操作使频率分数最大

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] 增加 或者 减少 1 。 最终数组的频率分数定义为数组中众数的 频率 。 请你返回你可以得到的 最大 频率分数。 众数指的…

excel经验

Q:我现在有一个excel&#xff0c;有一列数据&#xff0c;大概两千多行。如何在这一列中 筛选出具有关键字的内容&#xff0c;并输出到另外一列中。 A: 假设数据在A列&#xff08;A1开始&#xff09;&#xff0c;关键字为“ABC”在相邻空白列&#xff08;如B1&#xff09;输入公…

HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口

文章目录 HTTP查询参数请求示例接口文档——获取城市列表代码示例效果 带查询参数的HTTP接口示例——以python flask接口为例app.pyREADME.md运行应用API示例客户端示例关键实现说明&#xff1a;运行方法&#xff1a; HTTP查询参数请求示例 接口文档——获取城市列表 代码示例…

将飞帆制作的网页作为 div 集成到自己的网页中

并且自己的网页可以和飞帆中的控件相互调用函数。效果&#xff1a; 上链接 将飞帆制作的网页作为 div 集成到自己的网页中 - 文贝 进入可以复制、运行代码

Redis主从复制:告别单身Redis!

目录 一、 为什么需要主从复制&#xff1f;&#x1f914;二、 如何搭建主从架构&#xff1f;前提条件✅步骤&#x1f4c1; 创建工作目录&#x1f4dc; 创建 Docker Compose 配置文件&#x1f680; 启动所有 Redis&#x1f50d; 验证主从状态 &#x1f4a1; 重要提示和后续改进 …

k8s 1.30.6版本部署(使用canal插件)

#系统环境准备 参考 https://blog.csdn.net/dingzy1/article/details/147062698?spm1001.2014.3001.5501 #配置下载源 curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyri…