在標准C++中,為了保證封裝性,我們經常聲明一個私有變量,然后聲明兩個公有函數,即set函數和get函數。在Qt中我們可以使用宏 Q_PROPERTY() 宏來實現這些。一個屬性可以使用常規函數 QObject::property() 和 QObject::setProperty() 進行讀寫,不用知道屬性所在類的任何細節,除了屬性的名字。
Q_PROPERTY() 原型:
// 中括號中的內容為可選項
Q_PROPERTY(
type name //屬性的類型 名字
(READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)]) [RESET resetFunction] [NOTIFY notifySignal] //通知的信號名 [REVISION int] //版本號 [DESIGNABLE bool] //當前該屬性可不可以在設計模式設置 [SCRIPTABLE bool] //可以不可以被腳本訪問 [STORED bool] //屬性值是否存儲 [USER bool] //是否提供給用戶編輯權限 [CONSTANT] //常量 [FINAL] //不能被重寫
)
1. type name
屬性類型可以是QVariant支持的任何類型,也可以是用戶定義的類型;
2. READ 和 MEMBER
如果沒有MEMBER,則必須要有READ。
READ 后面定義獲取屬性值的函數,該函數是const;
WRITE 設置屬性值,是可選的;
MEMBER 如果一個屬性不需要 READ ,但又想使用屬性系統,可以使用MEMBER來注冊,MEMBER后面是成員變量的名字;
3. RESET
可選,將屬性設置為默認值,該RESET函數必須返回void並且不帶參數。
4. NOTIFY
可選,NOTIFY 后面跟該類中已經定義的一個信號函數,只要該屬性的值發生更改,就會發出該信號。這個信號函數必須采用零個或一個參數,該參數必須與屬性的類型相同。
5. REVISION int
可選,版本信息(通常用於QML)。
6. DESIGNABLE bool
可選,表示屬性是否能在GUI設計工具的屬性編輯器中可見(例如,Qt Designer)。大多數屬性是DESIGNABLE(默認為true)。
7. SCRIPTABLE bool
可選,SCRIPTABLE屬性表示腳本引擎是否應該可以訪問此屬性(默認為true)
8. STORED bool
可選,該屬性是單獨存在還是從其他值中獲取的。大部分是true,一個反例是QWidget::minimumWidth()的值從QWidget::minimumSize()中獲取,因此它的STORED為false。
9. USER bool
可選,表示是否可以被用戶所編輯。
10. CONSTANT
可選,CONSTANT表明屬性值是常量,不可更改,因此不能有WRITE方法或NOTIFY信號。對於給定的對象實例,常量屬性的READ方法每次調用時都必須返回相同的值。對於對象的不同實例,該常數值可以是不同的。
11. FINAL
可選,FINAL表示屬性不會被派生類覆蓋,在某些情況下,這可用於性能優化。
示例:
- 新建桌面應用程序TestProperty,父類QWidget,其他采用默認。
- 右鍵單擊項目添加自定義類MyPropertyClass,父類QObject.
- mypropertyclass.h文件中Q_OBJECT下方聲明屬性宏: Q_PROPERTY(QString title READ title WRITE setTitle USER true)
4. 聲明屬性讀取、設置函數,定義屬性變更時發送的信號,定義成員變量m_mask保存屬性值。
5. widget.h添加槽函數聲明
6. Widget類構造函數中添加如下代碼
========================================================================================================================