Qt每天一个小技巧之 Q_PROPERTY 的使用

The Property System

      在属性系统中,Qt提供了一个复杂的属性系统,与一些编译器供应商提供的类似。 然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译器特性,如__property或[property]。 Qt解决方案适用于Qt支持的每个平台上的任何标准c++编译器。 它基于元对象系统,元对象系统也通过信号和插槽提供对象间通信。    

 官方给的格式:

 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])

然后官方给的简单的例子:

 Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
      Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged)
      Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
      ...
  signals:
      void colorChanged();
      void spacingChanged();
      void textChanged(const QString &newText);

  private:
      QColor  m_color;
      qreal   m_spacing;
      QString m_text;

官方给的对应属性:

  • 如果没有指定MEMBER变量,则需要一个READ访问器函数。 它用于读取属性值。 理想情况下,const函数用于此目的,它必须返回属性的类型或对该类型的const引用。 例如,QWidget::focus是一个READ函数的只读属性,QWidget::hasFocus()。  
  • 一个可选的WRITE访问器函数。它用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。例如:QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例如,QWidget::focus没有对应的写函数。
  • 一个可选的RESET函数。用于设置属性的值到它的默认值。例如:QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它也具有一个RESET函数,QWidget::unsetCursor()。RESET函数必须返回void并且不带有任何参数。
  • 一个可选的NOTIFY信号。如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。
  • 一个DESIGNABLE变量表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了为这个变量传入true或false,你还可以指定一个bool型的成员函数。
    SCRIPTABLE变量表明这个属性是否可以被一个脚本引擎操作(默认是true)。你也可以赋予它true或false或bool型函数。
  • STORED变量表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。大多数属性都是需要保存的,但是,如QWidget::minimumWidth()就是不被保存的,因为它的值是从另一个属性QWidget::minimumSize()得来的。
  • USER变量表明属性是否被设计为面向用户的或用户可修改的类属性。通常,每个类只有一个USER属性。例如,QAbstractButton::checked是按钮类的用户可修改属性。注意QItemDelegate获取和设置widget的USER属性。
  • CONSTANT的出现表明属性的值是不变的。对于一个object实例,常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。
  • FINAL变量的出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不是被moc强制的。程序员必须永远注意不能重写一个FINAL属性。
     

 例子:

/*
1.本例子为比卡求不皮 基本

*/


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    enum Priority{ High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)
    void setPriority(Priority priority)
    {
        m_priority = priority;
        emit priorityChanged(priority);
    }
    Priority priority() const  //这里必须加载const
    { return m_priority; }

signals:
    void priorityChanged(Priority);
private:
    Ui::MainWindow *ui;
    Priority m_priority;
};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;   
    QObject * pro =&w;
    pro->setProperty("priority","VeryHigh");
    qDebug() << pro->property("priority") <<endl;
    w.setPriority(MainWindow::High);
    qDebug() <<  w.priority();
    w.show();

    return a.exec();
}

运行结果:

QVariant(int, 2) 

MainWindow::High

这个经常使用在qml 中,可以看着这个例子的使用

Qt Quick C++与QML混合编程_比卡丘不皮的博客-CSDN博客声明:本例子是Qt Quick核心编程中的一个小例子,有关混合编程的方式。有关详细编程,请查看对应书籍。话不多说看效果图:首先我们创建的是一个QtquickApp,工程名字为colorMaker项目,然后我们添加ColorMaker类:colorMaker.h#ifndef COLORMAKER_H#define COLORMAKER_H#include <QObject>#include <QColor>#include <QDa...https://blog.csdn.net/weixin_42126427/article/details/118896474喜欢我的博客的朋友,可以一起进步,让我们了解更多有意思的事情。

 

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值