在类中用Q_PROPERTY宏声明类的某个属性后,这个属性就具有了Meta-Object的特性了,如:
class Person : public QWidget
{
Q_OBJECT
/* 声明Person类有一个QString类型属性name,此属性可以通过getName读取,通过setName设置 */
/* 这些信息是告知Meta-Object System的 */
/* moc会处理这些Qt特有的东西 */
Q_PROPERTY(QString name READ getName WRITE setName)
public:
QString &getName() const
{
return name;
}
void setName(const QString &n)
{
name = n;
}
private:
QString name;
};
Q_PROPERTY完整声明如下:
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])
以下例子出自assistant
class MyClass : public QObject
{
// 这些宏都是为moc使用的,放在类的private部分
Q_OBJECT
/* 告诉 moc MyClass有一个Priority类型的priority属性,moc可以用priority方法读取,
* 用setPriority设置,这个值改变的时候会发射priorityChanged信号。注意,告知moc
* 的属性名为priority并不一定是m_priority,moc使用这个属性的时候是通过priority
* 这个名字找到的,进而调用READ,WRITE声明的关联函数(这些函数内部就会直接使用m_priority了)
*/
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
// Priority类型不是内置类型,moc不认识的,所以用下面这个宏告知moc
Q_ENUMS(Priority)
public:
MyClass(QObject *parent = 0);
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
// 必须只有一个Priority类型(或引用)的参数
void setPriority(Priority priority)
{
m_priority = priority;
emit priorityChanged(priority);
}
// 返回Priority类型(引用,指针),常为const
Priority priority() const
{ return m_priority; }
signals:
void priorityChanged(Priority);
private:
Priority m_priority;
};
使用:
MyClass *myinstance = new MyClass;
QObject *object = myinstance;
// 通过对象直接调用方法
myinstance->setPriority(MyClass::VeryHigh);
// moc使用setProperty方法查找priority名称,进而找到了用Q_PROPERTY宏注册的priority信息
object->setProperty("priority", "VeryHigh"); // 注意第二个参数是字符串