qt--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])

說明: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     

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM