[QT入門篇]1 QT中的對象模型

1.1       概述

QT是一個基於C++的圖形UI庫,但它不僅僅侷限於UI,它集成了當前相當廣泛的不同技術,如GUI技術、數據存儲技術、多媒體技術、網絡技術、Web技術、腳本技術等等。提到C++,必然涉及到對象模型。

標準的C++對象模型已經高效地支持了對象技術,但是標準C++對象模型的靜態特性在某些問題域中很不靈活。比如GUI就是這樣一種問題域,它即需要高效的運行效率,又需要高度的靈活性。很幸運,QT可以完美的適用於這個領域,它基於C++,同時提供了QT對象模型,即保證了運行速度又提供了GUI編程的靈活性。

下面介紹一下QT爲C++新增加的特徵:

  1. 強大的對象間無縫通信機制——信號槽;

  2. 可以定製和查詢的對象屬性;

  3. 強大的事件系統;

  4. 方便的國際化能力;

  5. 通過精密間隔的定時器在事件驅動的GUI中優雅地整合多種任務;

  6. 以自然的層次式和可查詢的對象樹形式組織對象的所有關係;

  7. 當守衛指針(QPointer)引用的對象被刪除的時候,它會自動被設置爲0,不像普通的C++指針,當他們的對象被刪除時他們就變得非常危險;

  8. 跨邊界動態轉換;

  9. 支持創建自定義類型。

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及其所有子類(直接子類或者間接子類)的拷貝構造函數和賦值運算符都是無效的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章