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
英文地址,請注明出處:http://en.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…