QT類庫
QT核心特色
- QT是一個跨平臺開發的類庫。
- QT的元對象編譯器MOC是一個預處理器,在源程序被編譯前先將這些QT特性的程序轉爲標準的C++兼容的形式,而後再有標準的C++編譯器進行編譯。也就是爲何在使用信號和槽的機制的類裏,必須添加一個Q_OBJECT宏的緣由,只有添加了這個宏,moc才能對類裏的信號與槽代碼進行預處理。
- QT Core模塊是qt類庫的核心。
QT元對象系統
- 元對象系統由三個基礎組成:(1)QObject類是全部使用元對象系統類的基類。(2)在一個類的private部分申明Q_OBJECT宏,使得類可使用元對象的特性,如動態屬性,信號與槽。(3)MOC爲每一個QObject的子類提供必要的代碼來實現元對象系統的特性;構建項目時MOC工具讀取C++源文件,當它發現類的定義裏有Q_OBJECT宏時,它會爲這個類生成另一個包含有元對象支持代碼的C++源文件,這個生成的源文件連同類的實現文件一塊兒被編譯和鏈接。
元對象的其它功能
- QObject::metaObject()函數返回關聯的元對象,元對象類QMetaObject包含了訪問元對象的一些接口函數。
- QMetaObject::newInstance()函數建立類的一個新的實例。
- QObject::inherits(const char* className)函數判斷一個對象實例是不是名稱爲className的類或QObject的子類的實例。
- QObject::tr()和QObject::reUtf8()函數可翻譯字符串,用於多語言界面設計。
- QObject::setProperty()和QObject::property()用於經過屬性名動態設置和獲取屬性值。
屬性系統
- QT提供了一個Q_PROPERTY()宏能夠定義屬性,他也是基於元對象系統實現的。
- 動態屬性,定義了屬性後,能夠經過QObject::setProperty()函數設置屬性值;能夠經過QObject::property()函數來獲取屬性值。
- 類的附加信息:屬性系統還有一個宏Q_CLASSINFO(),能夠爲類的元對象定義「名稱--值信息」。
信號與槽
- connect()函數有多種重載
- 不論是那種參數形式的connect()函數,最後都會有一個參數Qt::ConnectionType type,默認值爲Qt::AutoConnection.枚舉類型Qt::ConnectionType表示信號與槽之間的關聯方式,有Qt::AutoConnection(缺省值):若是信號的接受者和發送這在同一個線程,就使用Qt::DirectConnection方式;不然使用QT::QUeuedConnection方式,在信號發射時自動肯定關聯方式;Qt::DirectionConnection:信號被髮射時槽函數當即執行,槽函數和信號在同一個線程;Qt::QueuedConnection:在時間循環回到接收者線程後執行槽函數,槽函數與信號在不一樣的線程;Qt::BlockingQueuedConnection:與Qt::QueuedConnection類似,只是信號線程會阻塞直到槽函數執行完畢,當信號和槽在同一個線程時絕對不能使用這種方式,不然會形成死鎖。
- 使用Sender()得到信號發射者。例如在QSpinx的ValueChanged(int)信號的槽函數裏,能夠經過Sender()和qobject_cast得到信號發射者的指針,從而對信號發射者進行操做。QSpinBox *spinBox=qobject_caet<QSpinBox *>(sender());
- 自定義信號以及其使用:在本身設計的類裏也能夠自定義信號,信號就是在類定義裏聲明的一個函數,無需實現,只須要發射(emit)。信號函數必須是無返回值的函數,可是能夠有輸入參數。
Qt全局定義
頭文件包含了Qt類庫的一些全局定義,包括基本的數據類型,函數,和宏,通常Qt類的頭文件都會包含該頭文件。
java
數據類型定義
- 爲了確保在各個平臺上個數據類型都有統一肯定的長度,Qt爲各類常見的數據類型定義了類型符號。
- 數據類型定義以下圖所示:
![](http://static.javashuo.com/static/loading.gif)
函數
宏定義
經常使用的宏
- QT_VERSSION 這個宏展開爲數值形式0xMMNNPP表示QT編譯器版本,例如Qt編譯器版本爲Qt5.9.1,則QT_VERSION爲0x050901。這個宏經常使用語條件編譯設置,根據qt版本不一樣,編譯不一樣的代碼段。
- QT_VERSION_CHECK 這個宏展開爲Qt版本號的一個整數表示。
- QT_VERSION_STR 這個宏展開爲Qt版本號的字符串,如「5.9.0」
- Q_BYTE_ORDER,Q_BIG_ENDIAN和Q_LITTLE_ENDIAN;Q_BYTE_ORDER表示系統內存中數據的字節序,Q_BIG_ENDIAN表示大端字節序,Q_LITTLE_ENDIAN表示小端字節序。在判斷系統字節序時會用到。
- Q_DECL_IMPORT和Q_DECL_EXPORT 在使用或設計共享庫時,用於導出庫的內容。
- Q_DECL_OIVERRIDE 在類定義中,用於重載一個虛函數,使用此宏後,若是重載的虛函數沒有進行任何重載操做,編譯器將會報錯。
- Q_DECL_FINAL 這個宏將一個虛函數定義爲最終級別,不能再被重載,或定義一個類不能再被繼承。
- Q_UNUSED(name) 這個宏用於在函數中定義不在函數體力使用的參數。
- foreach(variable,container) 用於容器類的遍歷。
- forever 用於構造一個無限循環。
- qDebug(const char * message,...) 在debugger窗體顯示信息,若是編譯器設置了Qt_NO_DEBUG_OUTPUT,則不做任何輸出。相似的宏還有qWarning,qCritical,qFatal,qInfo,也是用於在debugger窗體顯示信息。
容器類
Qt容器類比標準模板庫(STL)中的容器類更輕巧,安全和易於使用。這些容器類是掩式共享和可重入的,並且他們進行了速度和存儲優化,他們是線程安全的,也就是說他們做爲制度容器可被多個線程訪問。函數
順序容器類
- Qt的順序容器類有QList,QLinkedList,QVector,QStack和QQueue。
- QList是最經常使用的容器類,基於數組列表的形式實現的。
- QLinkedList是鏈式列表,數據項不是用連續的內存存儲的,它基於迭代器訪問數據項。
- QVector提供動態數組的功能,如下標索引訪問數據;QVector的性能比QList更高,由於QVector的數據項是連續存儲的。
- QStack是提供相似於堆棧的後入先出操做的容器類,push()和pop()是主要的接口函數。
- QQueue是提供與相似於隊列先入先出操做的容器類,enqueue()和dequeue()是主要的操做函數。
關聯容器類
- 關聯容器類包括QMap,QMultiMap,QHash,QMultiHash,QSet。
- QMultiMap和QMultiHash支持一個鍵關聯多個值,QHash和QMultiHash類使用散列函數進行查找,查找的速度更快。
- QSet是基於散列表的集合模板類,他存儲數據的順序是不定的,查找值的速度很是快。QSet內部就是用QHash實現的。
- QMap<Key,T>提供一個字典,一個鍵映射一個值,QMap存儲數據是按照鍵的順序,若是不在意存儲順序,使用QHash會更快。
- QMultiMap是map的子類,是用於處理多隻映射的便利類。QMa正常狀況下是不容許多值映射,除非使用QMap::insertMulti()添加鍵值對。
- QHash是基於散列表來實現字典功能的模板類,QHash<Key,T>存儲的鍵值對具備很是快的查找速度。QHash和QMap,前者比後者的查找速度快;在後者上遍歷時,數據項是按照鍵排序的,而前者的數據項是任意順序的;QMap的鍵必須提供「<」運算符,QHash的鍵必須提供「==」運算符和一個名稱爲qHash()的全局散列函數。
- QMultiHash是QHash的子類,是用於處理多隻映射的便利類。
容器類的迭代
迭代器(iterator)爲訪問容器類裏的數據項提供了統一的方法;Qt有兩種迭代器類:Java類型迭代器和STL類型的迭代器。工具
- Java類型的迭代器更易於使用,且提供了一些高級的功能,而STL類型的迭代器效率更高。
- Qt還提供了一個關鍵字foreach(
裏定義的一個宏)用於方便地訪問容器裏全部數據項。
Java類型迭代器
對於每一個容器類,有兩個java類型迭代器:一個用於只讀操做,一個用於讀寫操做,每一個迭代器和容器類的迭代關係以下圖所示:
![](http://static.javashuo.com/static/loading.gif)
Java類型的迭代器的指針不是指向下一個數據項,而是在數據項之間。性能
STL類型迭代器
STL迭代器與Qt和STL的原生算法兼容,而且進行了速度優化,對於每個容器類,都有兩個STL類型迭代器,一個用於制度訪問,一個用於讀寫訪問,無需修改數據時必定使用制度迭代器,由於速度更快;STL類型迭代器是是數組的指針,因此++運算符使迭代器指向下一個數據項,「*」運算符返回數據項內容。與Java類型迭代器不一樣,STL迭代器直接指向數據項。STL迭代器類型以下所示:
測試
foreach能夠遍歷集合中全部的項
Qt類庫模塊
Qt類庫裏大量的類根據功能分爲各類模塊,這些模塊又分爲幾大類。優化
- Qt基本模塊:提供Qt在全部平臺上的基本功能。
- Qt附加木塊:實現一些特定功能的提供附加價值的模塊。
- 增值模塊:單獨發佈的提供額外價值的模塊或工具。
- 技術預覽模塊:一些處於開發階段,可是能夠做爲技術預覽使用的模塊。
- Qt工具:幫助應用程序開發的一些工具。
QT基本模塊
Qt基本模塊是Qt在全部平臺上的基本功能,他們在全部的平臺和目標平臺上均可以用。具體的模塊以下圖所示:
ui
- Qt Core模塊是Qt類庫的核心,其它全部的模塊都依賴於此模塊,若是是用qmake構建項目,則Qt Core模塊是自動被加入到項目的。
- Qt GUI模塊提供了用於開發GUI應用程序必要的類,使用qmake構建應用程序時,Qt GUI模塊是自動被加入項目的,若是不使用GUI功能,則須要在項目配置文件中加入以下一行:QT -=gui
- 其它模塊通常不會被自動加入到項目中,若是須要在項目中用某個模塊,則能夠在項目配置中個添加此模塊,例如Qt Network則須要在配置文件中加入:「QT += network」
Qt附加模塊
Qt附加模塊能夠實現一些特定目的,這些模塊可能只能在某些平臺上有,或只能用於某些操做系統,或只是爲了向後兼容。用戶安裝時能夠選擇性的安裝這些附加模塊。Qt附加模塊列表(未烈出一些過期的模塊,以及專門用於QML或QtQuick的模塊)以下圖所示:
![](http://static.javashuo.com/static/loading.gif)
Qt增值模塊
除了隨Qt5發佈的上述這些模塊,還有一些模塊是單獨發佈的,這些模塊只在商業版許可的Qt裏纔有。
![](http://static.javashuo.com/static/loading.gif)
技術預覽模塊
還處於開發和測試階段的模塊。
Qt工具
Qt工具在全部支持的平臺上均可以使用,用於幫助應用程序的開發和設計,Qt工具以下圖所示:
![](http://static.javashuo.com/static/loading.gif)