zoukankan      html  css  js  c++  java
  • Q_PROPERTY介绍

    QT提供了一个成熟的属性系统,但是作为一个跨平台的且与编译器无关的库,qt不依赖于非标准的编译器功能例如 __property or [property];

    QT的强大之处在于它可以支持任何标准的c++编译器。 QT是基于 Meta-Object System(元对象)和signals and slots(信号槽)的.

    Q_PROPERTY

    Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。

    1. Q_PROPERTY(type name READ getFunction [WRITE setFunction] [RESET resetFunction] [NOTIFY notifySignal] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL])  

    可能还不太好理解 不过下面介绍几个特殊的例子你就豁然开朗了

    1.  Q_PROPERTY(bool focus READ hasFocus)  
    2. Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)    
    3. Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)  

     一个属性行为类似于类里面的数据成员,但是他是却可以通过Meta-Object System来访问。    在外界看来,property跟类中数据成员没有什么区别,但是还是有几点不一样,参考qt文档,主要有以下几点:

    1.必须有一个read函数。它用来读取属性值。因此用Const限定。它的返回值类型必须为属性类型或者属性类型的引用或者指针。不能是其他类型例如:QWidget::hasFocus().  

    2.有一个可选的write函数。它用来设置属性值,它的返回值必须为void型,而起必须要含有一个参数。例如:QWidget::setEnabled()

    3.一个reset函数能够把property设置成其默认状态,它也是可选的。复位功能必须返回void,并且不带参数,

    4.一个NOTIFY信号是可选的 。如果定义,它提供了一个信号这个信号在值发生改变时会自动被触发。

    5.如果定义了"STODE"属性表明这是一直存在的。QWidget::minimumSize() 6.一个"DESIGNABLE"属性表明该property能在GUI builder(一般为Qt Designer)可见

    7.USER 属性 表面是否可以被用户所编辑

    8 CONST设定属性是不可修改的 所以不能跟WRITE或者NOTIFY同时出现

    9 FINAL表明该属性不会被派生类中重写

     

    然后对照这些,自己写了一个例子

    class Test : public QObject {

    Q_OBJECT

    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)

    public:

    Test(QObject *parent = 0) : QObject(parent) {}

    virtual ~Test(){}

    void setEnabled(bool e) { enabled = e; }

    bool isEnabled() const { return enabled; }

    private:

    bool enabled;

    };

     

    然后在主函数中

    Test *test = new Test;

    test->setProperty("enabled", true);

    //test->setEnabled(true);        //ok also work

    if(test->property("enabled").toBool()) .....

     

  • 相关阅读:
    解决浏览器兼容改内容的函数
    iPhone 和Android应用,特殊的链接:打电话,短信,email
    ArrayList和LinkedList的区别
    关于HashTable,HashMap和TreeMap的几点心得
    Android开发--List与ArrayList区别
    Android 版本升级涉及到的数据库数据迁移问题
    深入理解Android的startservice和bindservice
    Android之Activity的四种启动模式
    控制反转与依赖注入
    vi/vim基本使用方法
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/3488673.html
Copyright © 2011-2022 走看看