【Qt】Q_PROPERTY():属性系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/86562801

一、简介

Qt属性系统基于元对象Meta-Object系统,因此在使用时,需要继承QObject类并添加宏Q_OBJECT,属性除了具有类成员的功能外,还可以通过元对象系统访问,比如可以使用信号和槽机制。

二、使用方法

在继承QObject的类中,使用宏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])

先看一个官方的例子

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)

public:
    MyClass(QObject *parent = 0);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)

    void setPriority(Priority priority)
    {
        m_priority = priority;
        emit priorityChanged(priority);
    }
    Priority priority() const
    { return m_priority; }

signals:
    void priorityChanged(Priority);

private:
    Priority m_priority;
};

三、Q_PROPERTY()中关键字详解

1、说明

小括号“()”中的关键字是必须实现的、中括号“[ ]”中是可选的;

2、type name 属性的类型和名字

属性类型可以是QVariant支持的任何类型,也可以是用户定义的类型;

3、READ 和 MEMBER

如果没有MEMBER,则必须要有READ。
READ 后面定义获取属性值的函数,该函数是const,如上面例子中的Priority priority() const;
WRITE 设置属性值,是可选的;
MEMBER 如果一个属性不需要 READ ,但又想使用属性系统,可以使用MEMBER来注册,MEMBER后面是成员变量的名字;
如官方例子中:

    Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
signals:
    void textChanged(const QString &newText);
private:
    QString m_text;
4、RESET

可选,将属性设置为默认值,该RESET函数必须返回void并且不带参数。

5、NOTIFY

可选,NOTIFY 后面跟该类中已经定义的一个信号函数,只要该属性的值发生更改,就会发出该信号。这个信号函数必须采用零个或一个参数,该参数必须与属性的类型相同。

6、REVISION int

可选,版本信息(通常用于QML)。

7、DESIGNABLE bool

可选,表示属性是否能在GUI设计工具的属性编辑器中可见(例如,Qt Designer)。大多数属性是DESIGNABLE(默认为true)。

8、SCRIPTABLE bool

可选,SCRIPTABLE属性表示脚本引擎是否应该可以访问此属性(默认为true)

9、STORED bool

可选,该属性是单独存在还是从其他值中获取的。大部分是true,一个反例是QWidget::minimumWidth()的值从QWidget::minimumSize()中获取,因此它的STORED为false。

10、USER bool

可选,表示是否可以被用户所编辑。

11、CONSTANT

可选,CONSTANT表明属性值是常量,不可更改,因此不能有WRITE方法或NOTIFY信号。对于给定的对象实例,常量属性的READ方法每次调用时都必须返回相同的值。对于对象的不同实例,该常数值可以是不同的。

4、FINAL

可选,FINAL表示属性不会被派生类覆盖,在某些情况下,这可用于性能优化。

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/86562801