1. Q_PROPERTY
Qt提供了一個絕妙的屬性系統,Q_PROPERTY()是一個巨集,用來在一個類中宣告一個屬性property,由於該巨集是qt特有的,需要用moc進行編譯,故必須繼承於QObject類。
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[NOTIFY notifySignal]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])
Qt的屬性功能使得我們可以選擇訪問資料成員的方式,屬性就像是類的資料成員,但是在元物件系統中,它的其他特性是到處可見的(相比較於類成員的一般情況下私有化)
我們使用這個巨集的時候,注意兩個問題:
1)型別,屬性名和READ(讀)方法是必須的。也就是前三個引數可必須有的。型別可以是QVariant支援的任一型別,又或者是我們自定義的型別,其他是可選的。下面的title屬性定義可以這麼來說明:定義一個屬性title,型別是QString,讀title的方法是title()函式,寫title的方法是setTitle,這裡USER表示是否使用者自定義型別,這裡應該設定為false。
Q_PROPERTY(QString title READ title WRITE setTitle USER true);
2)屬性宣告完了以後,我們還需要進行讀寫函式的宣告和定義
下面是一些典型的宣告屬性的示例:
Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(bool animation READ getAnimation WRITE setAnimation)
Q_PROPERTY(QColor barColor READ getBarColor WRITE setBarColor)
- 一個屬性的行為就像類的資料成員,但是它還具有附加的特性,這些特性可以被元資料物件系統操作。這些特性是:
需要一個READ訪問器函式。用於讀屬性的值。理想情況下,有一個不變的函式用於此目的,並且它必須返回屬性的型別的值或指標或引用。例如,QWidget::focus是一個只讀的屬性,它對應一個讀函式:QWidget::hasFocus()。 - 一個可選的WRITE訪問器函式。它用於設定屬性的值。它必須返回空並且至少具有一個引數,引數是屬性型別的值或指標或引用。例如:QWidget::enabled具有WRITE函式QWidget::setEnable()。只讀屬性不需要寫函式。例如,QWidget::focus沒有對應的寫函式。
- 一個可選的RESET函式。用於設定屬性的值到它的預設值。例如:QWidget::cursor具有典型的READ和WRITE函式,QWidget::cursor()和QWidget::setCursor(),並且它也具有一個RESET函式,QWidget::unsetCursor()。RESET函式必須返回void並且不帶有任何引數。
- 一個可選的NOTIFY訊號。如果被定義了,訊號將在屬性的值改變時發出。訊號必須帶有一個引數,這個引數的型別必須與屬性相同;引數儲存的是屬性的新值。
- 一個DESIGNABLE變量表明此屬性是否在介面設計器的屬性編輯器中出現。大多數屬性是可見的,除了為這個變數傳入true或false,你還可以指定一個bool型的成員函式。
- SCRIPTABLE變量表明這個屬性是否可以被一個指令碼引擎操作(預設是true)。你也可以賦予它true或false或bool型函式。
- STORED變量表明瞭屬性是否被認為是獨立存在還是依賴於其它的值而存在。它也表明是否在儲存物件狀態時儲存此屬性的值。大多數屬性都是需要儲存的,但是,如QWidget::minimumWidth()就是不被儲存的,因為它的值是從另一個屬性QWidget::minimumSize()得來的。
- USER變量表明屬性是否被設計為面向使用者的或使用者可修改的類屬性。通常,每個類只有一個USER屬性。例如,QAbstractButton::checked是按鈕類的使用者可修改屬性。注意QItemDelegate獲取和設定widget的USER屬性。
- CONSTANT的出現表明屬性的值是不變的。對於一個object例項,常量屬性的READ方法在每次被呼叫時必須返回相同的值。此常量值可能在不同的object例項中不相同。一個常量屬性不能具有WRITE方法或NOYIFY訊號。
- FINAL變數的出現表明屬性不能被派生類所重寫。有些情況下,這可以用於效率優化,但不是被moc強制的。程式設計師必須永遠注意不能重寫一個FINAL屬性。