在Qt框架中,QString
是一個強大而靈活的字串容器,專為處理 Unicode
字元而設計。它提供了許多方便的方法來操作和處理字串,使得在跨平臺開發中能夠輕鬆地進行文字操作。QString 是 Qt 開發中不可或缺的一部分,它的靈活性和強大的功能使其成為處理文字和字串操作的理想選擇。本篇部落格將深入探討 QString
的各種用法,包括字串的連線、追加與移除、格式化輸出、統計字串長度、去空格操作、字串的切割與擷取,以及型別轉換等,以幫助讀者更好地利用這一重要的字串容器。
首先讀者需要開啟Qt Creator
程式並新建一個Qt Console Application
專案,建立選項我們可以直接採用預設設定,當建立成功後讀者可看到如下圖所示的預設選項;
上述案例中使用的就是命令列程式開發,接下來我們將演示如何靈活的使用QString
容器實現對字串的靈活管理,在使用之前讀者需要包含#include <QString>
標頭檔案,該檔案內包含了所有字串操作函數。
在Qt中,字串的定義可以使用QString str1
的方式實現,我們可以使用簡單的加號 +
或者 append
方法將兩個字串連線在一起。
程式碼中的toStdString
則代表將字串轉換為標準的std格式,除了使用 toStdString()
將 QString
轉換為標準的 C++ 字串 (std::string
) 之外,還有其他幾種字串轉換的方法:
toLatin1()
和 toUtf8()
:
toLatin1()
返回一個 Latin-1 編碼的 QByteArray
,其中包含了 QString
的內容。
toUtf8()
返回一個 UTF-8 編碼的 QByteArray
。
QString str = "Hello, LyShark!";
QByteArray latin1Data = str.toLatin1();
QByteArray utf8Data = str.toUtf8();
toLocal8Bit()
:
返回一個包含 QString
內容的 QByteArray
,使用本地字元集編碼。
QString str = "Hello, LyShark!";
QByteArray localData = str.toLocal8Bit();
toLatin1()
、toUtf8()
、toLocal8Bit()
的 constData()
方法:
這些方法返回一個指向字串資料的常數指標,可以直接傳遞給需要 C 風格字串的函數。
QString str = "Hello, LyShark!";
const char* latin1Data = str.toLatin1().constData();
const char* utf8Data = str.toUtf8().constData();
const char* localData = str.toLocal8Bit().constData();
這些方法允許根據需要選擇不同的字元集和編碼方式,並在Qt應用程式中方便地進行字串和位元組陣列之間的轉換。
如下我們演示如何簡單的實現字串的拼接,範例程式碼如下:
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString Str1 = "hello";
QString Str2 = "lyshark";
QString temp;
temp = Str1 + " " + Str2;
std::cout << temp.toStdString().data() << std::endl;
std::cout << (Str1 + " " + Str2).toStdString().data() << std::endl;
return a.exec();
}
QString
提供了多種方法來追加與移除字串,追加時可以使用append()/push_back()
在移除時可以使用remove()
,而prepend()
提供了在頭部追加的功能。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString Str = "hello ";
Str.append("lyshark");
Str.push_back("test");
Str.remove("hello");
Str.prepend("-->");
std::cout << Str.toStdString().data() << std::endl;
return a.exec();
}
QString容器預設就支援自定義輸出,該容器內部有一個sprintf
可以很容易的實現字串的連線與個性化輸出,當然了其初始化有兩種方式,一種是定義後呼叫,另一種是在初始化時填充。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString Str1;
Str1.sprintf("%s %s","Welcome","to you !");
std::cout << Str1.toStdString().data() << std::endl;
QString Str2;
Str2 = QString("%1 is age = %2 . ").arg("lyshark").arg("24");
std::cout << Str2.toStdString().data() << std::endl;
std::cout << (QString("1") + QChar('A')).toStdString().data() << std::endl;
std::cout << (QString("2") + QString('B')).toStdString().data() << std::endl;
return a.exec();
}
字串長度統計有多種方式,可以使用count()
也可以是size()
也可以使用length()
三者均可以。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString Str1;
Str1.sprintf("%s %s","Welcome","to you !");
std::cout << Str1.toStdString().data() << std::endl;
// 實現統計字串長度
std::cout << Str1.count() << std::endl;
std::cout << Str1.size() << std::endl;
std::cout << Str1.length() << std::endl;
return a.exec();
}
空格的去除有多種方式,使用trimmed()
可實現去掉字串首尾兩端空格,使用simplified
可去掉所有空格,中間連續的只保留一個。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 去空格
QString Str1 = " hello lyshark welcome ! ";
Str1 = Str1.trimmed(); // 去掉首尾空格
Str1 = Str1.simplified(); // 去掉所有空格,中間連續的只保留一個
std::cout << Str1.toStdString().data() << std::endl;
return a.exec();
}
使用 QString
類中的一些字串操作方法,通過mid
可以擷取區間引數,當然remove
也支援區間引數。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str1 = "hello lyshark !";
// 從索引2開始向後取10
str1 = str1.mid(2,10);
std::cout << str1.toStdString().data() << std::endl;
//移除,1,3兩個位置的字元
std::cout << (QString("123456").remove(1,3)).toStdString().data() << std::endl;
// 超過 11 個字元就保留 11 個字元,否則不足替換為 '.'
std::cout << (QString("abcdefg").leftJustified(11,'.',true)).toStdString().data() << std::endl;
return a.exec();
}
在一個字串中查詢是否包含一個子串,這裡通過使用Qt::CaseInsensitive
指定不區分大小寫,通過Qt::CaseSensitive
指定為區分大小寫,查詢函數為contains
保持不變。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "hello lyshark welcome admin";
int index;
bool ref;
// 查詢字串中是否包含特定字元
ref = str.contains("lyshark",Qt::CaseInsensitive); // 不區分大小寫
std::cout << ref << std::endl;
ref = str.contains("LYSHARK",Qt::CaseSensitive); // 區分大小寫
std::cout << ref << std::endl;
return a.exec();
}
開頭結尾的判斷可以使用startsWith
和endsWith
,在判斷開頭時通過Qt::CaseInsensitive
標誌定義,而結尾則使用Qt::CaseSensitive
標誌。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "hello lyshark welcome admin";
int index;
bool ref;
// 判斷是否以某個字串開頭或結束
ref = str.startsWith("hello",Qt::CaseInsensitive); // 判斷是否hello開頭
std::cout << ref << std::endl;
ref = str.endsWith("lyshark",Qt::CaseSensitive); // 判斷是否lyshark結尾
std::cout << ref << std::endl;
return a.exec();
}
位置查詢也是很常見的需求,我們可以使用indexOf()
來查詢最早出現某個字元的位置,當然也可以使用lastIndexOf()
查詢最後一次出現的位置,這兩個函數接收一個字串用作過濾條件。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "hello lyshark welcome admin";
int index;
bool ref;
// 從字串中取左邊/右邊多少個字元
index = str.indexOf(" "); // 第一個空格出現的位置
std::cout << str.left(index).toStdString().data()<< std::endl;
index = str.lastIndexOf(" "); // 最後一個空格出現的位置
std::cout << str.right(str.size() - index - 1).toStdString().data() << std::endl;
index = str.indexOf("r"); // 第一個出現r的位置
std::cout << str.left(index).toStdString().data()<< std::endl;
return a.exec();
}
字串的替換可以使用replace()
函數,該函數接受兩個引數第一個時需要替換的字串,第二個是替換後的字串。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "hello lyshark welcome admin";
int index;
bool ref;
// 替換字串中所有的lyshark為admin
str = str.replace("lyshark","admin");
std::cout << str.toStdString().data() << std::endl;
return a.exec();
}
字串的擷取可以使用自帶的section()
函數,該函數接受三個引數,第一個是擷取字元分隔符,第二和第三個是需要擷取的欄位,當然也可以通過靈活的利用left/mid/right/indexOf
實現對字串的擷取。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 字串的擷取
QString str1 = "uname,uage,usex";
std::cout << str1.section(",",0,0).toStdString().data() << std::endl;
std::cout << str1.section(",",1,1).toStdString().data() << std::endl;
// 自己擷取
QString str2 ="192.168.1.10";
std::cout << str2.left(str2.indexOf(".")).toStdString().data() << std::endl;
std::cout << str2.mid(str2.indexOf(".")+1,3).toStdString().data() << std::endl;
std::cout << str2.mid(str2.indexOf(".")+1,1).toStdString().data() << std::endl;
std::cout << str2.right(str2.size() - (str2.lastIndexOf(".")+1)).toStdString().data() << std::endl;
// 切割字串
std::cout << (QString("1,2,3,4,5,6").split(',')[2]).toStdString().data() << std::endl;
return a.exec();
}
判斷一個字串是否為空,這個功能可以直接使用isNull/isEmpty
函數來實現,如下是這三個函數的具體區別。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 判斷字串是否為空
QString str4,str5="";
std::cout << str4.isNull() << std::endl; // 為空則為True
std::cout << str5.isNull() << std::endl; // \0不為空
std::cout << str5.isEmpty() << std::endl; // 為空則為False
return a.exec();
}
與標準C語言一致,小寫轉為大寫同樣可以呼叫toUpper()
函數實現,小寫的話可以使用toLower()
函數實現。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "uname,uage,usex";
QString int_str = "100,200,300";
// 大小寫轉換
str = str.toUpper(); // 轉為大寫
std::cout << str.toStdString().data() << std::endl;
str = str.toLower(); // 轉為小寫
std::cout << str.toStdString().data() << std::endl;
return a.exec();
}
字串與整數的轉換同樣可以使用標準函數實現,例如將字串轉換為整數,我們首先可以使用section()
擷取字串中的特定整數,接著使用toInt()
將其轉換為十進位制整數,當然如果是十六進位制可以傳入16,而將整數轉換為字串可以通過setNum()
實現直接轉換。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "uname,uage,usex";
QString int_str = "100,200,300";
// 將字串轉為整數
bool flag = false;
QString x = int_str.section(",",0,0); // 提取出第一個字串
int dec = x.toInt(&flag,10); // 轉為十進位制整數
std::cout << dec << std::endl;
int hex = x.toUInt(&flag,16); // 轉為十六進位制數
std::cout << hex << std::endl;
// 將整數轉為字串
int number = 100;
QString number_str;
number_str = number_str.setNum(number,16); // 轉為十六進位制字串
std::cout << number_str.toStdString().data() << std::endl;
return a.exec();
}
當然了標準的QString
容器內天生也自帶轉換功能,我們可以使用這些功能進行自定義轉換,如下所示;
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 100 轉16進位制
std::cout << (QString::number(100,16)).toStdString().data() << std::endl;
// 轉換為 16 進位制,不足 8 位前面補 ‘0’
std::cout << (QString("0%1").arg(123,8,16,QLatin1Char('0'))).toStdString().data() << std::endl;
// 轉為8進位制
std::cout << QString("0%1").arg(QString::number(100,8)).toStdString().data() << std::endl;
std::cout << (QString("0%1").arg(QString::number(.777,'f',1))).toStdString().data() << std::endl;
return a.exec();
}
浮點數與字串的轉換可以使用sprintf()
格式化,也可以使用asprintf()
格式化,這兩個函數的區別是,QString::sprintf
是在原始字串上操作, QString::asprintf
允許建立一個格式化的字串,並返回一個新的 QString
物件,而不是直接在現有物件中進行修改。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 格式化輸出轉換
float total = 3.1415926;
QString str_total;
// 將浮點數轉換為字串
str_total = str_total.sprintf("%.4f",total);
std::cout << str_total.toStdString().data() << std::endl;
// 將雙精度浮點數轉為字串
str_total = QString::asprintf("%2f",total);
std::cout << str_total.toStdString().data() << std::endl;
return a.exec();
}
在這裡需要多說一下型別轉換,一般StdString()
可以直接使用ToUTF8()
轉換格式,而QByteArray
也可以直接使用StdString()
函數將其轉換成QString
格式。
#include <QCoreApplication>
#include <QString>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 編碼之間的轉換
QString str_string = "welcome to you !";
// 將StdString轉換為UTF8格式
QByteArray ba = str_string.toUtf8();
std::cout << ba.toStdString().data() << std::endl;
// 型別轉換QByteArray轉換QString
QByteArray byte;
byte.resize(2);
byte[0]='1';
byte[1]='2';
QString strs = byte;
std::cout << strs.toStdString().data() << std::endl;
return a.exec();
}