No Qt, Q_PROPERTY
as 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_PROPERTY
Exemplo 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 QObject
classe, abra person.h
o arquivo e adicione o seguinte código:
Aqui, adicionamos duas propriedades:
name
eage
,name
a propriedade é uma string eage
a 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.cpp
arquivo, adicione o seguinte código:
Aqui, implementamos
Person
os métodos de atributo na classe e todos são muito simples:getName()
egetAge()
retornam os valores das variáveis de membro dem_name
e respectivamente, e definem e de acordo com os parâmetros e emitem os sinais correspondentes;m_age
setName()
setAge()
m_name
m_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);
}
}
Person
4. Agora podemos usar essa classe na função main , abrir widget.cpp
o arquivo e adicionar o seguinte código:
Aqui, criamos um novo
Person
objeto, usamossetProperty()
o método para definir o valor de suas propriedadesname
eage
e o consultamos, então usamossetName()
o método esetAge()
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;
}