2011-05-26 48 views
9

我在爲圖形和GUI組件工作的軟件系統中廣泛使用Qt。但是,對於大多數內部算法和數據處理而言,Qt起着較小的作用。可互換地使用std :: string和QString

我經常會遇到需要將std :: string轉換爲QString或反之亦然。我傾向於儘可能多地使用std :: string,並且在需要將字符串傳遞給類似於文件系統的Qt類時使用QString 只有

正如我今天上午編程時,它打擊了我可能是糟糕的設計,讓std :: string和QString都散佈在我的代碼中。我應該完全切換到QString?有沒有其他人遇到這種設計選擇?

Qt提供了很多與STL相同的功能,但由於Qt不夠標準化和穩定,所以我仍然猶豫不決。

回答

9

是的,我有過這種情況。我一直在使用Qt的程序,但是我必須將它連接到預期爲std::string的庫。 QString的好處是它明確使用Unicode,而C++標準庫對編碼沒有任何保證。

的解決方案是在此庫的邊界轉換與

QString toQString(std::string const &s) 
{ 
    return QString::fromUtf8(s.c_str()); 
} 

std::string fromQString(QString const &s) 
{ 
    return std::string(s.toUtf8().data()); 
} 

由於文庫產生的含UTF-8 std::string的。

你似乎想要的是完全相反:全部使用std::string並在Qt邊界轉換。這似乎很完美。它需要比總是使用QString更多的工作,但是當你需要一個非QString接收庫時,你將不得不付出努力,而你的非GUI組件不依賴於Qt(hurray!)。

+1

'QString'有一個'toStdString()'方法。請參閱:http://doc.trolltech.com/4.5/qstring.html#toStdString。要從'std :: string'創建'QString',你可以使用這個構造函數:http://doc.trolltech.com/4.5/qstring.html#QString-7 – yasouser 2011-06-01 18:37:57

+1

@yasourer:是的,但那些依賴於全局設置字符編碼。這些函數來自一個庫,它從另一個庫中獲得'std :: string',它總是包含UTF-8。 – 2011-06-01 20:18:17

+0

通過傳遞長度以及返回QString :: fromUtf8(s.c_str(),s.size())和auto buf = s,即使字符串包含嵌入的NUL,也可以改進這些函數的工作。 toUtf8();返回std :: string(buf.data(),buf.size());'。 – 2017-08-24 08:28:54

6

我會說在你的程序核心中使用std::string,並且當你在GUI部分工作時將它們轉換爲QString。我想要改變你的GUI工具包,那會更容易。