版权声明:本文为博主原创文章,未经博主允许不得转载。 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,将会在另外一篇博文中给出