QT数据转换(数值、QString、QByteArray、结构体)
1. 基础类型互转
数值 ↔ QString
//int → QString
int intVal = 255;
QString strInt1 = QString::number(intVal); // 十进制:"255"
QString strInt2 = QString::number(intVal, 16); // 十六进制小写:"ff"
QString strInt3 = QString::number(intVal, 16).toUpper(); // 十六进制大写:"FF"
setNum()亦可,均可实现有无符号转QString
//QString→ int
QString qstr = "10086";
int num = qstr.toInt(); // num=10086
//QString→ uint
转无符号类型使用toUInt();
bool ↔ QString
// 1. bool → QString
// 方法1
bool flag = true;
QString qstrBool = flag ? QString("true") : QString("false");
// 方法2
bool test = true;
QString s = QString::number(test);
// 方法3
bool bInput = false;
QString s = QVariant(bInput).toString();
// 2. QString → bool
QString s = "true";
bool bInUse = QVariant(s).toBool();
QString 与 QByteArray 互转
QString 是 Unicode 文本容器(UTF-16),QByteArray 是原始字节容器(8 位),互转核心是编码映射,需显式指定编码避免乱码。
- QString → QByteArray
#include <QString>
#include <QByteArray>
#include <QTextCodec>
QString qstr = "QT字符串转字节数组:中文测试";
// 1. 转UTF-8编码(推荐:网络传输、跨平台文件)
QByteArray utf8Arr = qstr.toUtf8(); // 用途:QTcpSocket发送、QFile写入(UTF-8文件)
// 2. 转系统本地编码(如Windows GBK、Linux UTF-8,慎用跨平台)
QByteArray localArr = qstr.toLocal8Bit();
// 3. 转GBK编码(需显式指定编解码器,用于旧系统交互)
QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
if (gbkCodec)
{
QByteArray gbkArr = gbkCodec->fromUnicode(qstr); // GBK编码字节
}
- QByteArray → QString
// 1. UTF-8字节 → QString(对应toUtf8())
QByteArray utf8Arr = "\xE4\xB8\xAD\xE6\x96\x87\xE6\xB5\x8B\xE8\xAF\x95"; // UTF-8编码的"中文测试"
QString qstr1 = QString::fromUtf8(utf8Arr); // 正确解析:"中文测试"
// 2. GBK字节 → QString(对应fromUnicode())
QByteArray gbkArr = "\xD6\xD0\xCE\xC4\xB2\xE2\xCA\xD4"; // GBK编码的"中文测试"
QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
if (gbkCodec) {
QString qstr2 = gbkCodec->toUnicode(gbkArr); // 正确解析:"中文测试"
}
// 3. 二进制字节 → 十六进制文本(用于日志/协议解析)
QByteArray binaryArr = QByteArray::fromRawData("\x01\x02\xFF\xFE", 4); // 二进制数据
QString hexStr = binaryArr.toHex().toUpper(); // 转十六进制文本:"0102FFFE"
结构体与 QByteArray 互转
1、结构体转换QByteArray
/**
* @brief 结构体转QByteArray(通用函数)
* @tparam T 结构体类型(必须是POD类型,不含指针)
* @param structData 输入的结构体对象
* @return 转换后的QByteArray
*/
template <typename T>
static QByteArray structToByteArray(const T& structData) {
QByteArray byteArray;
// 预留结构体大小的空间(字节数 = 结构体大小)
byteArray.resize(sizeof(T));
// 将结构体的内存数据拷贝到QByteArray
std::memcpy(byteArray.data(), &structData, sizeof(T));
return byteArray;
}
2、QByteArray转换结构体
/**
* @brief QByteArray转结构体(通用函数)
* @tparam T 结构体类型(必须是POD类型,不含指针)
* @param byteArray 输入的QByteArray
* @param structData 输出的结构体对象(引用)
* @return 转换是否成功(true:成功;false:字节数组大小不匹配)
*/
template <typename T>
static bool byteArrayToStruct(const QByteArray& byteArray, T& structData) {
// 校验字节数组大小是否与结构体大小一致(避免内存越界)
if (byteArray.size() != static_cast<int>(sizeof(T))) {
qWarning() << "转换失败:字节数组大小(" << byteArray.size()
<< ")与结构体大小(" << sizeof(T) << ")不匹配!";
return false;
}
// 将字节数组的数据拷贝到结构体
std::memcpy(&structData, byteArray.data(), sizeof(T));
return true;
}

浙公网安备 33010602011771号