1.1 概述
QT是一個基於C++的圖形UI庫,但它不僅僅侷限於UI,它集成了當前相當廣泛的不同技術,如GUI技術、數據存儲技術、多媒體技術、網絡技術、Web技術、腳本技術等等。提到C++,必然涉及到對象模型。
標準的C++對象模型已經高效地支持了對象技術,但是標準C++對象模型的靜態特性在某些問題域中很不靈活。比如GUI就是這樣一種問題域,它即需要高效的運行效率,又需要高度的靈活性。很幸運,QT可以完美的適用於這個領域,它基於C++,同時提供了QT對象模型,即保證了運行速度又提供了GUI編程的靈活性。
下面介紹一下QT爲C++新增加的特徵:
強大的對象間無縫通信機制——信號槽;
可以定製和查詢的對象屬性;
強大的事件系統;
方便的國際化能力;
通過精密間隔的定時器在事件驅動的GUI中優雅地整合多種任務;
以自然的層次式和可查詢的對象樹形式組織對象的所有關係;
當守衛指針(QPointer)引用的對象被刪除的時候,它會自動被設置爲0,不像普通的C++指針,當他們的對象被刪除時他們就變得非常危險;
跨邊界動態轉換;
支持創建自定義類型。
1.2 重要的類
QMetaClassInfo:關於一個類的附加信息類;
QMetaEnum:元數據枚舉類;
QMetaMethod:關於成員函數的元數據;
QMetaObject:包含了關於QT對象的元信息;
QMetaProperty:屬性的元數據;
QMetaType:在元對象系統中管理被命名的類型;
QObject:所有QT對象的基類;
QObjectCleanupHandler:觀測多個QObjects對象的生命週期;
QPointer:爲Qobject對象提供守衛指針的模板類;
QSignalBlocker:圍繞QObject::blockSignals()封裝的安全異常類;
QSignalMapper:從可識別的發送者綁定信號;
QVariant:類似於QT大多數通用數據的聯合體。
1.3 QT對象:標識與值
我們需要將QT對象作爲標識(identity)而不是值(value)。這裏說一下標識和值的區別:值是拷貝的或者分配來的;標識則是克隆來的。克隆意味着建立新的標識,而不僅僅是舊標識的一份拷貝。舉個例子,雙胞胎是不同的標識(identity),他們看起來是一樣的,但是他們有不同的名字,不同的地點,和許多完全不同的社會關係網。
克隆一個標識是比拷貝和分配值更復雜的操作。我們在QT對象模型中看到這樣的情形。
一個QT對象:
1 也許有一個獨特的QObject::objectName()。如果我們拷貝一個Qt對象,我們將給這份拷貝什麼名字?
2 在對象層次中有位置。如果我們拷貝QT對象,這份拷貝將放在何處?
3 可以關聯到其他QT對象,來發送或者接受信號,如果們拷貝一個QT對象,我們如何將這些鏈接轉移到拷貝對象上?
4 可以在運行時增加新的屬性,這些屬相在聲明時則沒有。如果我們拷貝QT對象,是否拷貝對象包含了原始對象的新增屬性?
出於上述原因,QT對象應該被作爲標識(identity)對待而不是值(value)。標識是被克隆的,不是拷貝或者分配來的,同時克隆是比複製或者分配值更加複雜的操作。因此,QObject及其所有子類(直接子類或者間接子類)的拷貝構造函數和賦值運算符都是無效的。