Introdução à macro Q_PROPERTY no Qt

No Qt, Q_PROPERTYas macros permitem que as propriedades sejam adicionadas ao sistema meta-objeto meta-objeto ao declarar uma classe, de modo que as instâncias dessa classe possam ser consultadas e alteradas em tempo de execução e as propriedades possam ter diferentes tipos de dados, como QString, int, etc. , e pode ter recursos de leitura/gravação, somente leitura ou notificação, além disso, os metadados podem ser definidos para cada propriedade, como intervalo, mínimo/máximo, nome de exibição, etc.;

A sintaxe básica da macro Q_PROPERTY para declarar uma propriedade:

Q_PROPERTY(type name READ getFunction [WRITE setFunction]
           [RESET resetFunction] [NOTIFY notifySignal]
           [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool]
           [USER bool] [CONSTANT] [FINAL] [REQUIRED])
  • type: O tipo de dados do atributo;
  • name: O nome do atributo;
  • READ getFunction: O nome da função getter usada para ler o valor da propriedade, uma função de membro público que deve ser prefixada com get;
  • [WRITE setFunction]: O nome da função setter usada para definir o valor da propriedade, uma função de membro público que deve ser prefixada com set, no modo gravável, esse parâmetro é obrigatório;
  • [RESET resetFunction]: o nome da função de membro público usada para redefinir o valor da propriedade;
  • [NOTIFY notifySignal]: O nome do sinal emitido quando o valor da propriedade muda;
  • [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL] [REQUIRED]: Algumas opções extras, que podem ser adicionadas seletivamente conforme necessário;
Q_PROPERTYExemplo de código usado no Qt Creator :

1. Crie um novo projeto de aplicativo de widget;

2. Crie uma nova classe no projeto, nomeie-a Person, herde da QObjectclasse, abra person.ho arquivo e adicione o seguinte código:

Aqui, adicionamos duas propriedades: namee age, namea propriedade é uma string e agea propriedade é um inteiro e, para cada propriedade, especificamos seus leitores e gravadores e seus sinais correspondentes;

#ifndef PERSON_H
#define PERSON_H

#include <QObject>

class Person : public QObject
{
    
    
    Q_OBJECT
    // 在此处声明属性
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(int age READ getAge WRITE setAge NOTIFY ageChanged)

public:
    explicit Person(QObject *parent = nullptr);
    ~Person() override;

    // 声明属性的读取器(getter)
    QString getName() const;
    int getAge() const;

    // 声明属性的写入器(setter)
    void setName(const QString &name);
    void setAge(int age);

signals:
    // 声明属性变化的信号
    void nameChanged(const QString &newName);
    void ageChanged(int newAge);

private:
    QString m_name;
    int m_age;
};

#endif // PERSON_H

3. No person.cpparquivo, adicione o seguinte código:

Aqui, implementamos Personos métodos de atributo na classe e todos são muito simples: getName()e getAge()retornam os valores das variáveis ​​de membro de m_namee respectivamente, e definem e de acordo com os parâmetros e emitem os sinais correspondentes;m_agesetName()setAge()m_namem_age

#include "person.h"

Person::Person(QObject *parent) : QObject(parent), m_age(0)
{
    
    

}

Person::~Person()
{
    
    

}

QString Person::getName() const
{
    
    
    return m_name;
}

int Person::getAge() const
{
    
    
    return m_age;
}

void Person::setName(const QString &name)
{
    
    
    if (m_name != name) {
    
    
        m_name = name;
        emit nameChanged(m_name);
    }
}

void Person::setAge(int age)
{
    
    
    if (m_age != age) {
    
    
        m_age = age;
        emit ageChanged(m_age);
    }
}

Person4. Agora podemos usar essa classe na função main , abrir widget.cppo arquivo e adicionar o seguinte código:

Aqui, criamos um novo Personobjeto, usamos setProperty()o método para definir o valor de suas propriedades namee agee o consultamos, então usamos setName()o método e setAge()para alterar manualmente o valor da propriedade e acionamos o sinal correspondente, finalmente, vamos O objeto é excluído para liberar recursos;

#include "widget.h"
#include "ui_widget.h"
#include "person.h"
#include <QDebug>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    // 创建一个新的 Person 对象
    auto person = new Person(this);

    // 设置属性的值
    person->setProperty("name", "Tom");
    person->setProperty("age", 21);

    // 查询属性的值并输出结果
    qDebug() << person->property("name").toString();
    qDebug() << person->property("age").toInt();

    // 更改属性的值并再次查询
    person->setProperty("name", "Jerry");
    person->setProperty("age", 22);

    qDebug() << person->property("name").toString();
    qDebug() << person->property("age").toInt();

    // 手动触发属性变化的信号
    person->setName("Rick");
    person->setAge(23);

    // 释放资源
    delete person;
}

Widget::~Widget()
{
    
    
    delete ui;
}


Acho que você gosta

Origin blog.csdn.net/qq_33867131/article/details/130390233
Recomendado
Clasificación