1. 程式人生 > >【Qt】資料型別和有用的資料操作類

【Qt】資料型別和有用的資料操作類

除了C++提供的基本資料型別之外,Qt還提供了了對開發者而言非常有用的多種資料型別。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提供了可以比較/判斷資料型別值的一般函式和模板函式。下面對這些函式進行簡單的介紹:

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資料型別和有用的資料操作類總結