Qt Meta Object

在类中用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"); // 注意第二个参数是字符串




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值