我的QT5學習之路(三)——模板庫、工具類和控件(中)


一、前言

  前面我們了解了關於Qt字符串的一些簡單操作,容器類的分類和各自的主要特點以及用途,這一次我們了解一些常見的工具類和常見的控件。

二、QByteArry和QVariant

2.1  QByteArry

 關於QByteArry,我們在上篇中曾經看到過。QByteArry和QString的功能和API基本類似,具有很多相似的函數。不同的地方在於QByteArry能夠存儲原生的二進制數據和8位編碼的文本數據,那么何為原生的二進制數據和8為編碼的文本數據呢?稍微了解計算機原理的童鞋可能都知道,計算機內部所有的數據都是以0和1的形式進行存儲的,這種存儲形式就是二進制。對於這些二進制代碼,計算機並不知道其具體的含義,需要通過上下文進行決定。對於文件而言,即使是一個文本文件,讀出時也可以按照二進制的形式讀出,這就是二進制格式。如果把這些二進制中的0和1按照編碼解釋成一個個的字符,就可以構成一個文本了。因此,QByteArry實際上楇原生的二進制,也可以看作是文本,具有文本的一些操作。但是對於文本字符流的操作,還是建議使用QString而不是QByteArry,因為QString支持Unicode。

  出於方便,QByteArry自動的保證最后一個字節之后的那位的值是“\0”,這樣也導致QByteArry可以容易的轉變為const char*,同樣作為存儲二進制的數據類型,QByteArry中間也可以存儲“\0”。

2.2 QVariant

  有時候我們希望將不同類型的數據存儲在一個變量中,如果是在Java中可以通過Object類型的變量實現,但是C++中沒有這種公有繼承的類。Qt通過聲明一個類,這個類包含所有需要存儲的數據類型,這就是QVariant類。

  QVariant類可以保存很多Qt的數據類型,包括QBrush、QColor、QCursor、QDataTime、QFont、QKeySequence、QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,並且還包括基本類型,int、float等等。

  Qvariant還可以保存很多的集合類型,如QMap<QString,QVariant>,QStringList和QList<QVariant>。其中item view classes,數據庫模塊和QSettings都大量使用了QVariant類,方便讀寫數據。

  QVariant支持嵌套存儲。

 1 QMap<QString,QVariant>map;
 2 map["int"]=123;
 3 map["double"]=1.23;
 4 map["string"]="123";
 5 map["color"]=QColor(255,0,0);
 6 qDebug()<<map["int"]<<map["int"].toInt();
 7 qDebug()<<map["double"]<<map["double"].toDouble();
 8 qDebug()<<map["string"]<<map["string"].toString();
 9 //使用value<T>()模版函數,獲取存儲在QVariant中的數據
10 qDebug()<<map["color"]<<map["color"].value<QColro>();

  我們也可以自定義QVariant,被QVariant存儲的數據類型必須有一個默認的構造函數和一個拷貝構造函數,同時首先必須使用Q_DECLARE_METATYPE()宏。通常會將這個宏放在類的聲明所在頭文件的下面。

      

1 Q_DECLARE_METATYPE(human) 
1 human humen ;  
2 QVariant variant = QVariant::fromValue(humen );  
3 // ...  
4 if (variant.canConvert<human >()) {  
5     human h= variant.value<human>();  
6     // ...  
7 } 

三、算法及正則表達式

3.1 Qt5常用算法

  常用算法在Qt的<QtAlgorithm>和<QtGlobal>模塊中。

 1 #include <QCoreApplication>
 2 #include <QString>
 3 #include <QtDebug>
 4 int main(int argc, char *argv[])
 5 {
 6     QCoreApplication app(argc, argv);
 7     double a=-19.35,b=5.6;
 8     double c=qAbs(a); //取絕對值
 9     double max=qMax(b,c); //取最大值
10 
11     int bi=qRound(b);  //取整
12     int ci=qRound(c);
13 
14 
15     qDebug()<<"a="<<a;
16     qDebug()<<"b="<<b;
17     qDebug()<<"c=qAbs(a)= "<<c;
18     qDebug()<<"qMax(b,c)= "<<max;
19     qDebug()<<"bi=qRound(b)= "<<bi;
20     qDebug()<<"ci=qRound(c)= "<<ci;
21 
22 
23     qSwap(bi,ci);     //交換值 24     qDebug()<<"qSwap(bi,ci): "<<"bi= "<<bi<<"ci= "<<ci;
25 
26     return app.exec();
27 }

 

3.2 基本的正則表達式

  Qt的QRegExp類是正則表達式的表示類,它基於Perl的正則表達式語言,完全支持Unicode,可以方便的完成處理字符串的一些操作,如驗證、查找、替換和分割等。

  正則表達式有表達式(expressions)、量詞(quantifiers)和斷言(assertions)組成。

  (1)最簡單的表達式是一個字符。比如我想要表示字符集的表達式可以使用[AEIOU]表示匹配所有的大些的原因字母;使用[^AEIOU]表示匹配所有的非元音字母;連續的字符集可是使用表達式[a-z],表示匹配所有的小寫字母。

  (2)量詞說明表達式出現的次數,如“x[1,2]”表示x至少有一個,最多有兩個。

  在計算機語言中,標識符通常要求以字母或下划線開頭,后面可以是字母、數字和下划線。比如“[A-Za-z_]+[A-Za-z_0-9]*”

  +表示[A-Za-z_]至少出現一次,可以出現多次

  *表示[A-Za-z_0-9]可以出現零次或者多次

正則表達式的量詞

 

量詞 含義 量詞 含義
E? 匹配0次或1次 E[n,] 至少匹配n次
E+ 匹配1次或多次 E[,m] 最多匹配m次
E* 匹配0次或多次 E[n,m] 至少匹配n次,最多匹配m次
E[n] 匹配n次    

正則表達式的字符集

 

對象 意義
C 單個字符標識其本身,除非它在正則表達式中有特殊意義
\c 特殊字符本身
\a 匹配ASCII bell(BEL,0x07)
\f 匹配ASCII form feed(FF,0x0C)
\n 匹配ASCII 行(LF,0x0A,Unix newline)
\r 匹配ASCII 回車(CR,0x0D)
\t 匹配ASCII  水平tab鍵(HT,0x09)
\v 匹配ASCII 豎直tab鍵(VT,0x0B)
\xhhhh 匹配Unicode字符十六進制數hhhh(0x0000 -0xFFFF)
\0ooo 匹配八進制數ooo(0-0377)
. 匹配任意字符(包括newline)
\d 匹配數字(Qchar::isDiagit())
\D 匹配非數字
\s 匹配空格字符(Qchar::isSpace())
\S 匹配非空格字符
\w 匹配單詞字符(Qchar::isLetterOrNumber(),Qchar::isMark(),或者’_’)
\W 匹配非單詞字符
\n 匹配第幾個backreference 例如\1,\2

 

  (3)“^” "$" "\b"都是正則表達式的斷言

正則表達式的斷言

 

符號 含義 符號 含義
^ 表示在字符串開頭進行匹配 \B 非單詞邊界
$ 表示在字符串結尾進行匹配 (?=E) 表示表達式后緊隨E才匹配
\b 單詞邊界 (?!E) 表示表達式后不緊隨E才匹配

  舉例說明,如果只有在using后面是namespace時才匹配using,則可以使用"using(?=E\s+namespace)" (此處“?=E”后面的“\s”表示匹配一個空白字符)。

  如果使用“using(?!E\s+namespace)”,則表達式只有在using 后面不是namespace時才匹配using。

  如果使用“using\s+namespace”,則匹配為using namespace。

  C++編譯器轉義反斜杠,在正則表達式中包含\,需要寫成\\,若要匹配反斜杠字符本身,鍵入四次\\\\。

  正則的知識還是挺多的,因為自己還沒有真正用過Qt的正則,這里先挖一個坑,以后有很好的例子的時候再補上來,嘿嘿。這里給一個不錯的總結博客,希望能夠幫到你。點擊這里,跳轉......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM