【Qt】資料型別和有用的資料操作類
除了C++提供的基本資料型別之外,Qt還提供了了對開發者而言非常有用的多種資料型別。Qt提供的資料型別分為基本資料型別和類形態的資料型別。
基本資料型別
Qt支援多個平臺,建立的應用程式需要在多種平臺上都具有相同大小的資料型別。為了能精確指定資料型別的大小,Qt提供了一下的基本資料型別:
型別 | 大小 | 說明 |
bool | 8位 | true/false |
qint8 | 8位 | signed char |
qint16 | 16位 | signed short |
qint32 | 32位 | signed int |
qint64 | 64位 | long long int |
quint8 | 8位 | unsigned char |
quint16 | 16位 | unsigned short |
quint32 | 32位 | unsigned int |
qunit64 | 64位 | unsigned long long int |
float | 32位 | 浮點數 |
double | 64位 | 浮點數 |
const char* | 32位 | 指向字串常量的指標 |
比較和判斷變數的函式
Qt提供了可以比較/判斷資料型別值的一般函式和模板函式。下面對這些函式進行簡單的介紹:
函式 | 說明 |
T qAbs(const T &value) | 返回絕對值 |
const T& qBound(const T& min,const T& value, const T& max) | 返回最大值和最小值之間值 |
void qCritical(const Char* msg) | 處理Critical訊息的函式 |
void qDebug(const Char* msg) | 輸出除錯資訊的函式 |
void qFatal(const Char* msg) | 處理錯誤資訊的函式 |
bool qFuzzyCompare(double p1,double p2)[static] | 比較浮點值的函式 |
bool qFuzzyCompare(float p1,float p2)[static] | 比較浮點值的函式 |
QtMsgHandler qInstallMsgHandler(QtMsgHandler handler) | 使用者自定義函式,輸出Qt定義的除錯、預警、嚴重等訊息 |
const T& qMax(const T& value1,const T& value2) | 返回兩個值中的最大值 |
const T& qMin(const T& value1,const T& value2) | 返回兩個值中的最小值 |
qint64 qRound64(qreal value) | 64位整型四捨五入函式 |
int qRound(qreal value) | 整型四捨五入函式 |
資料類
Qt提供基本資料型別的同時,為了在開發應用程式時能順利操作資料,還提供了各種類。
QBitArray
QBitArray類提供了位陣列,通過AND、OR、XOR、NOT執行為操作,從而減少不必要的位資料複製造成的記憶體浪費。
QBitArray類的初始化方法為:
QBitArray ba(200);
QBitArray可以重新調整陣列大小。
QBitArray ba;
ba.resize(3);
ba[0] = true;
同樣,QBitArray支援&(AND)、|(OR)、^(XOR)、~(NOT)運算。
提供的成員函式可通過false、true操作所有宣告為QBitArray類的陣列:
QBitArray ba(200);
ba.fill(true);
QBrush
QBrush類用於定義QPainter圖形填充模式。一個筆刷(Brush)可以表現風格、顏色、斜度和質地。比如:
QPainter painter(this);
painter.setBrush(Qt::cyan);
painter.setPen(Qt::darkCyan);
painter.drawRect(0,0,100,100);
QByteArray
QByteArray類用於將字串資料儲存到位元組陣列,可以儲存Raw資料和字串(String)型(包括最後的'\0')的位元組。與const char等字元常量想比,更簡單易用。QByteArray在複製同一記憶體區域的字串期間,會訪問其它處理器,減少記憶體佔用,從而高效使用記憶體。
因此,在嵌入式Linux平臺使用QByteArray時,可提高記憶體的使用效率。
QByteArray類可將字串儲存到建構函式:
QByteArray ba("Hello");
除了使用建構函式儲存字串的方法外,還可以使用函式resize()動態分配大小:
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
可以使用at()函式讀取陣列中特定位置的資料:
for(int i=0;i<ba.size();i++){
if(ba.at(i)>='a'&&ba.at(i)<='f')
cout<<"Found in range [a-f]"<<endl;
}
QByteArray可以使位元組陣列包含字串結束符'\0'。此時,如果利用函式size()返回陣列字串的整體大小,則其內不包含'\0'。
QByteArray ba1("ca\0r\0t");
qDebug()<<ba1.size(); //返回2
qDebug()<<ba1.constData();
QByteArray ba2("ca\0r\0t",3);
qDebug()<<ba2.size(); //返回3
qDebug()<<ba2.constData();
QByteArray ba3("ca\0r\0t",4);
qDebug()<<ba3.size(); //返回4
qDebug()<<ba3.constData();
const char cart[]={'c','a','\0','r','\0','t'};
QByteArray ba4(QByteArray::fromRawData(cart,6));
qDebug()<<ba4.size(); //返回6
qDebug()<<ba4.constData();
QByteArray提供的成員函式可以在字串的前半部分或後半部分新增字元和字串,並可更換特定位置的資料。
QByteArray x("and");
qDebug()<<x.prepend("rock "); //返回“rock and”
qDebug()<<x.append(" roll"); //返回"rock and roll"
qDebug()<<x.replace(5,3,"&"); //返回“rock & roll”
QByteArray可以解碼(Decode)Base 64格式的資料,使用成員函式FromBase64()即可。
QByteArray text=QByteArray::fromBase64("UXQgaXMgZ3JlYXQh");
qDebug()<<text.data(); //返回Qt is great!
使用基於Base64編碼(encode)的資料的演算法使用的是RFC2045。此外,還可以改變儲存為十六進位制的資料,以及URL/URI格式輸入的編碼資料。
QByteArray text=QByteArray::fromHex("517420697320677265617421");
qDebug()<<text.data();
QByteArray text1=QByteArray::fromPercentEncoding("Qt%20is%20great%33");
qDebug()<<text1.data();
可以返回從字串陣列左邊開始指定位置的資料。函式left()將指定的大小轉換為引數:
QByteArray x("Pineapple");
QByteArray y=x.left(4);
qDebug()<<y; //返回“Pine”
此外,如果使用函式leftJustfied(),則可以使用從特定位置字串之後開始指定的字元:
QByteArray x("apple");
QByteArray y=x.leftJustified(8,'.');
qDebug()<<y; //返回“apple...”
QByteArray還可以將儲存的字串資料變為int、float、long等型別的資料並儲存。
QByteArray str("FF");
bool ok;
int hex=str.toInt(&ok,16);
int dec=str.toInt(&ok,10);
qDebug()<<hex<<dec;
QColor
QColor類提供基於RGB、HSV、CMYK的色彩值。換言之,除了用RGB(紅綠藍)構成顏色外,也會將HSV(色調、飽和度、亮度)和CMYK用作構成要素。
QColor主要使用RGB值。為了使用HSV和CMYK,可以使用函式toHsv()和toCmyk()進行轉換。
QCursor
QCursor類可以將滑鼠游標指定為任意形狀。此類主要用於在特定控制元件上建立滑鼠游標並設定位置。除標準滑鼠游標形狀外,還可以使用QBitmap、Mask、Hospot建立使用者自定義的游標形狀。
QDate
QDate類提供有關日期的功能。使用系統時鐘(Clock)讀取當前日期的年、月、日;QDate利用函式currentDate()讀取當前時間,利用函式fromString()在字元中說明日期。
QDate類通過year()、mouth()和day()函式讀取年、月、日,而且可以讀取羅馬字母格式的日期簡稱和全程。像給int型增加數字一樣,利用函式addYears()、addMouths()和addDays()給當前日期的年、月、日增加引數值。
QDate類提供比較日期的功能:
QDate d1(1999,1,1);
QDate d2(2000,3,2);
qDebug()<<d1.daysTo(d2); //返回426
QDate類通過文字格式顯示所有輸入的字元,因此,顯示日期的模式字元必須放在引號內輸入:
QDate d1=QDate::fromString("02.25","MM.dd");
QString str=d1.toString("yyyy.MM.dd");
qDebug()<<str;
QFont
QFont類指定字型的屬性,可以使用文字的字號、顏色、加粗、下劃線、傾斜等屬性。
QFont font("Times", 10, QFont::Bold);
QImage
QImage類可以訪問影象等畫素資料,提供與硬體無關的影象顯示功能。Qt還提供了與QImage類功能類似的QPixmap、QBitmap、QPicture。
在這四個類中,QPixmap類在操作和顯示影象方面功能最佳,而QImage類則在直接訪問畫素和連線並使用I/O方面表現不俗。
QKeySequence
QKeySequence類指定選單快捷鍵,提供可快速執行選單專案的使用者介面。通過最常用的Ctrl鍵和字母的組合方式指定快捷鍵。
QKeySequence(tr("ctrl+P"));
QKeySequence(Qt::CTRL+Qt::Key_P);
QMargins
QMargins類指定舉行4個區域的邊距值,即左、上、下、右這4個區域。
利用函式setLeft()、setRight()、setTop()和setBottom()可以分別設定相應的邊距值。
QUrl
QUrl類在使用URL的介面中很好用,它提供了多種功能以操作編碼或未編碼的URL。
QUrl url("www.lvchademiao.com/list of time");
qDebug()<<url.toEncoded();
qDebug()<<QUrl::fromEncoded("www.lvchademiao.com/list%20of%20time");
容器類
與STL相比,Qt提供的容器類使用起來更安全、更簡單,而且都是輕量化的。因此Qt提供的容器類可以代替STL提供的容器類。
QHash<Key,T>
QHash類提供了基於散列表的字典。儲存方式時鍵(Key)、值(Value)成對儲存。通過鍵可以檢索到要查的資料。QHash的功能雖然與QMap的功能非常類似,但其內部運算比QMap要更快。
為了通過鍵值使用QString且儲存int,可進行如下宣告:
QHash<QString,int> hash;
hash["one"]=1; //存值
hash.insert("seven",7); //存值
int num1=hash["one"]; //取值
int num2=hash.value("seven"); //取值
qDebug()<<num1<<num2;
QMultiHash<Key,T>
QMultiHash是繼承自QHash的類,比QHash更適合儲存多種雜湊值。雖然QHash不允許一鍵多值,但是QMultiHash卻允許。因此QMultiHash提供了QHash擴大形態的類功能。
QMultiHash可以將儲存為多值的項轉換為QList的項:
QList<int> list=hash.values("number");
for(int i=0;i<list.size();i++){
qDebug()<<list.at(i);
}
QList<T>
QList<T>以列表形態儲存並管理值,並能進行基於快速索引的訪問,還可以快速刪除資料。QList類的使用方法與QLinkedList、QVector類的使用方法類似。
QList是基於索引的類,比QLinkedList的迭代器使用起來更方便,儲存資料時分配記憶體的速度比QVector快。
比較不一樣的是QList使用運算子將內容新增到列表。
QList<QString> list;
list<<"one"<<"two"<<"three"; //向列表新增值
for(int i=0;i<list.size();i++){
if(list.at(i)=="two")
qDebug()<<list.at(i); //從列表取值
}
QLinkedList<T>
QLinkedList<T>類基於迭代器,可以插入和刪除列表的專案。
QLinkedList<QString> list;
list<<"one";
list<<"two";
QVector<T>
QVector<T>作為容器類之一,可以快速儲存相關專案到儲存器的位置,並提供基於索引的快速訪問。
QVector將專案儲存到向量,一般在宣告的同時分配向量大小:
QVector<QString> vector(20);
vector<<"one";
vector.append("two");
qDebug()<<vector.at(0);
vector[0]="three";
qDebug()<<vector.at(0);
當使用“<<”或者append()函式時,是在整個向量的末尾新增專案。
QStack<T>
QStack<T>是提供棧演算法的類,其結構是後進先出(LIFO)。
QStack<int> stack;
stack.push(1); //入棧
stack.push(2);
while(!stack.isEmpty()){
qDebug()<<stack.pop(); //出棧
}
QQueue<T>
QQueue<T>類提供了佇列演算法的類,是先進先出的結構,與棧相反。
QQueue<int> queue;
queue.enqueue(1); //入佇列
queue.enqueue(2);
while(!queue.isEmpty()){
qDebug()<<queue.dequeue(); //出佇列
}
QSet<T>
QSet<T>是Qt容器類之一,儲存結構沒有指定順序,故可以快速查詢。QSet的內部結構由QHash實現。通過儲存QString的方法可以實現初始化。
QSet<QString> set;
set.insert("one");
set<<"two";
字串類
QByteArray
QByteArray類提供位元組(8位)單位的陣列,如下所示將字元陣列儲存到QByteArray中:
QByteArray ba("Qt");
qDebug()<<ba.size(); //返回2
利用成員函式size()獲得字元陣列的長度,儘管其中包含了字串結束標誌'\0',但是size()結果中並不顯示出來。
為了新增和編輯QByteArray儲存的字元陣列,Qt提供了成員函式append()、prepend()、insert()、replace()、remove()等等函式。
QByteArrayMatcher
QByteArrayMatcher類在位元組陣列中查詢匹配的位元組陣列模式。
QByteArray x("hello qt byebye"); //整體字串
QByteArray y("qt"); //要尋找的字串
QByteArrayMatcher matcher(y); //尋找器
qDebug()<<matcher.indexIn(x,0); //尋找匹配
QChar
用於支援16位Unicode字元的類。
QString str1="Hello Qt",str2;
QChar* data=str1.data();
while(!data->isNull()){
str2.append(data->unicode());
data++;
}
qDebug()<<str2; //輸出“Hello Qt”
QString
QString類支援Unicode字元的字串,可以儲存16位QChar。
QString類可以使用%1、%2~%99的引數範圍顯示或儲存字串:
QString str=QString("Hello %1 , Byebye %2").arg("Qt").arg("WinForm");
qDebug()<<str;
QStringList
QStringList類繼承自QList<QString>,可進行“<<”運算和大量的成員函式。
QStringMatcher
QStringMatcher類比較QString字串,以查詢對應的字元。
最終總結起來的部分,可以參考連結: QT資料型別和有用的資料操作類總結。