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])
說明:type name 定義屬性,類型可以是QVariant支持的任一類型,又或者是我們自定義的類型--屬性就是類的數據成員 --必須的
READ getFunction 讀取屬性的函數,必須返回屬性類型的值或指針或引用--必須的
WRITE setFunction 設置屬性值的函數,必須返回空並且至少具有一個參數,參數是屬性類型的值或指針或引用
RESET resetFunction reset函數能夠把property設置成其默認狀態,必須返回void並且不帶有任何參數
NOTIFY notifySignal 定義信號,如果被定義了,信號將在屬性的值改變時發出。信號必須帶有一個參數,這個參數的類型必須與屬性相同;參數保存的是屬性的新值
USER bool USER屬性 表面是否可以被用戶所編輯
CONSTANT CONST設定屬性是不可修改的 所以不能跟WRITE或者NOTIFY同時出現
FINAL 表明該屬性不會被派生類中重寫
READ,WRITE和RESET函數都可以被繼承。它們也可以是虛函數。當它們在被多重繼承中被繼承時,它們必須出現在第一個被繼承的類中
test.h
#ifndef TEST_H #define TEST_H #include <QObject> class Test : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) //自定義屬性--類成員函數 public: explicit Test(QObject *parent = nullptr); void setEnabled(bool e); //寫函數 bool isEnabled(); //讀函數 bool enabled; //創建屬性--成員變量 signals: }; #endif // TEST_H
test.cpp
#include "test.h" Test::Test(QObject *parent) : QObject(parent) { } void Test::setEnabled(bool e) { enabled = e; } bool Test::isEnabled() { return enabled; }
win.h
#ifndef WIN_H #define WIN_H #include <QWidget> #include "test.h" //導入包含自定義屬性的類 #include <QDebug> class Win : public QWidget { Q_OBJECT public: Win(QWidget *parent = nullptr); ~Win(); }; #endif // WIN_H
win.cpp
#include "win.h" Win::Win(QWidget *parent) : QWidget(parent) { Test *test = new Test; //創建具有自定義屬性的類對象 test->setProperty("enabled", true); //設置屬性--方法一 //test->setEnabled(true); //設置屬性--方法二 QVariant v=test->property("enabled"); //返回屬性值--方法一 //QVariant(bool, true) bool b=v.toBool(); //轉化為bool類型 b=test->isEnabled(); //返回屬性值--方法二 qDebug()<<b; } Win::~Win() { }
上面工程下載:鏈接:https://pan.baidu.com/s/1bhfqfGomPm-b4raCpe_HzQ 提取碼:6666