Qt文档阅读笔记-Q_PROPERTY解析及实例

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

目录

官方解析

博主栗子


官方解析

这个宏用于继承于QObject的类声明属性。这样声明后的属性行为与类数据成员一样,但是他们可以通过元对象系统进行访问。

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

这个属性需要属性名,以为返回值类型,以及READ函数。返回值类型只要是QVariant支持的都阔以(这里要特别注意Q_DECLARE_METATYPE声明的类型也是可以用的),还有几个属性是可选的,但是写一个WRITE函数是很常见的。其他的属性处理USER是false外其他都为true。

Q_PROPERTY(QString title READ title WRITE setTitle USER true)

关于这个宏的更读信息,以及这个宏的详细使用要看Qt's Property System这篇文档。

博主栗子

运行截图如下:

myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
public:
    explicit MyClass(QObject *parent = 0);

    enum Priority{One,Two,Three};
    Q_ENUM(Priority)

    void setPriority(Priority priority);
    Priority priority()const;

public slots:
    void prioritySLOT(Priority priority);

signals:
    void priorityChanged(Priority);

private:
    Priority m_priority;

};

#endif // MYCLASS_H

main.cpp

#include "myclass.h"
#include <QApplication>
#include <QMetaObject>
#include <QMetaProperty>
#include <QDebug>
#include <QVariant>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyClass *myinstance=new MyClass;
    QObject *object=myinstance;

    object->setProperty("priority","Two");
    //myinstance->setPriority(MyClass::Two);      Method 2

    //change value
    myinstance->setPriority(MyClass::Three);

    const QMetaObject *metaobject=object->metaObject();
    for(int i=0;i<metaobject->propertyCount();i++){
        QMetaProperty metaproperty=metaobject->property(i);
        qDebug()<<object->property(metaproperty.name());
    }

    return a.exec();
}

myclass.cpp

#include "myclass.h"
#include <QDebug>

MyClass::MyClass(QObject *parent) : QObject(parent)
{
    connect(this,SIGNAL(priorityChanged(Priority)),this,SLOT(prioritySLOT(Priority)));
}

void MyClass::setPriority(Priority priority)
{
    m_priority=priority;
    emit priorityChanged(priority);
}

MyClass::Priority MyClass::priority() const
{
    return m_priority;
}

void MyClass::prioritySLOT(MyClass::Priority priority)
{
    qDebug()<<"prioritySLOT called! The priority value is "<<priority;
}

运行截图如下:

当去掉

Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)

后运行截图如下:

这里可以看到元对象属性里面没有他了,

关于为什么一开始就会有个QString,类型的属性,并且名字为objectname,将会在另外一篇博文中给出

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/82768121