传说中的Q_PROPERTY怎么使用



Q_PROPERTY在QT中应用是非常广泛的,而且比较好用。

这里看一下Q_PROPERTY的构成:

Q_PROPERTY(type name  
02. READ  getFunction  //属性名 
03. [WRITE setFunction] //读函数 
04. [RESET resetFunction]       
05. [NOTIFY notifySignal]  
06. [DESIGNABLE bool]  
07. [SCRIPTABLE bool]  
08. [STORED bool]  
09. [USER bool]  
10. [CONSTANT]  
11. [FINAL]) 

一个属性行为类似于类里面的数据成员,但是他是却可以通过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 TimeSleepConifg : public QObject//这里一定要注意,要使用 Q_PROPERTY必须继承QObject,否则无法使用

{
    Q_OBJECT//这个宏定义也是必须的
    Q_PROPERTY(int m_time_cont READ timeCnt WRITE setTimeCnt NOTIFY timeCntChanged)//
public:
    void setTimeCnt(int e)//写函数
    {
        m_time_cont = e;
        emit timeCntChanged();//这里触发信号,主要前面要加emit
    }
    int  timeCnt() const//读函数
    {
        return m_time_cont;
    }
    void jsonFileWrite_T(QString Icont);//这个是我写的从一个json文件里去解析
    QString  jsonFileRead_T();//这是json文件的解析并且将得到的值返回
    TimeSleepConifg();//这是构造函数,在构造函数里面;setTimeCnt(jsonFileRead_T().toDouble());
//调用jsonFileRead_T返回的值赋值给m_time_cont这是给它赋值的过程
Q_SIGNAL void timeCntChanged();//这是信号,在setTimeCnt()函数中被调用,意思就是一旦值发生更改将触发这个信号,
//只要引用了m_time_cont的地方都发生更改
private:
    int m_time_cont;//这是定义的一个属性变量在qml中我们要引用的,这里可以看到它是个Q_PROPERTY中 是一样的
};
那么,接下来我们看一下qml中是怎么用到的
Text{
    id:text1
    x:50
    y:80
    width: 63
    height: 26
    text:idRootPriv.m_vm.time_obj.m_time_cont;//这里就绑定了m_time_cont,只要它发生更改就会自动更改
                                           //这里的time_obj是上面那个类实例后的指针,前面的是我管理的类你们可以不看。
    verticalAlignment: Text.AlignTop
    horizontalAlignment: Text.AlignLeft
}

QQ:609162385,希望能和大家交流交流

 






  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qtc++开发者

你的鼓励是我们创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值