找回密码
 立即注册
Qt开源社区 门户 查看内容

Qt之Q_PROPERTY

2019-9-26 16:11| 发布者: admin| 查看: 784| 评论: 0

摘要: Q_PROPERTY     Q_PROPERTY()是个宏。用来在一个类中声明一个属性property,该宏是qt特有的,需moc进行编译,必须继承QObject类。     该Qt宏多用于QML、QtScript、Designer插件等场景。     原型:Q_ ...
Q_PROPERTY

     Q_PROPERTY()是个宏。用来在一个类中声明一个属性property,该宏是qt特有的,需moc进行编译,必须继承QObject类。
     该Qt宏多用于QML、QtScript、Designer插件等场景。

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

        举例
          Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
          Q_PROPERTY(bool maxValue READ getMaxValue WRITE setMaxValue )

        属性



    READ访问器函数

         用于读属性的值,并且它是必须的。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。



    WRITE访问器函数

         用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。



    RESET函数

         用于设置属性的值到它的默认值。RESET函数必须返回void并且不带有任何参数。



    NOTIFY信号

         如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。



    DESIGNABLE变量

         表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了为这个变量传入true或false,你还可以指定一个bool型的成员函数。



    SCRIPTABLE变量

         表明这个属性是否可以被一个脚本引擎操作(默认是true)。你也可以赋予它true或false或bool型函数。



    STORED变量

         表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。



    USER变量

         表明属性是否被设计为面向用户的或用户可修改的类属性。通常,每个类只有一个USER属性。(是否用户自定义类型)。



    CONSTANT

         它出现表明属性的值是不变的。对于一个object实例,常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。



    FINAL变量

         它出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不是被moc强制的。



    注:

         READ,WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时,它们必须出现在第一个被继承的类中。

    使用
      // .h:class MainWindow : public QMainWindow{ Q_OBJECT
      Q_PROPERTY(QString context READ getValue WRITE setValue NOTIFY contextChange)
      public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow();
      protected:void setValue(const QString &); QString getValue();signal:void contextChange(cont QString &);
      public slots:void on_set_clicked(); // set按钮void on_get_clicked(); // get按钮void contextChange(cont QString &);
      private: Ui::MainWindow *ui;
      QString context;};
      // .cppMainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); connect(this,&MainWindow::contextChange,this,&MainWindow::contextChange);}
      MainWindow::~MainWindow(){delete ui;}
      void MainWindow::contextChange(cont QString &){ ui->label->setText(property("context").toString());}
      void MainWindow::setValue(const QString &_context){ context = _context;}
      QString MainWindow::getValue(){return context;}
      void MainWindow::on_set_clicked(){ setProperty("context",ui->lineEdit->text()); contextChange(context);}
      void MainWindow::on_get_clicked(){ ui->label->setText(property("context").toString());}


          如代码,设置(setProperty)、获取(property)、信号(contextChange)属性。

      喜欢的话请分享给更多人。多谢,抱拳。

      觉得好看,请点这里↓↓↓

      ----------------------------------------------------------------------------------------------------------------------
      我们尊重原创,也注重分享,文章来源于微信公众号:Qt开发者中心,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
      ----------------------------------------------------------------------------------------------------------------------

      鲜花

      握手

      雷人

      路过

      鸡蛋
      
      公告
      可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了