属性系统概述
- 🌟 静态属性与动态属性
- 🌟 官方文档中的定义
- 🌟《Qt 5.9 C++开发指南》中的定义
- 🌟 Qt中属性的使用
🌟 静态属性与动态属性
-
✨ 静态属性 :在创建QObject类时通过宏Q_PROPERTY定义的属性,它是在程序编译时确定的,称之为静态属性。静态属性支持元信息,可以通过元对象系统查询和访问,但其值不能动态更改。静态属性会注册到元对象系统中,可以通过元对象系统查询到已注册的属性信息。
-
✨ 动态属性:在QOject类的函数内通过QObject::setProperty(const char* str,QVariant value)来定义的属性,它是在运行时动态添加到对象上的属性,称之为动态属性。这些属性的值可以在运行时修改和查询,而不需要在类定义中显式声明。动态属性不会被注册到元对象系统中,因此无法通过元对象系统查询其元信息。
🌟 官方文档中的定义
Qt provides a sophisticated property system similar to the ones supplied by some compiler vendors. However, as a compiler- and platform-independent library, Qt does not rely on non-standard compiler features like __property or [property]. The Qt solution works with any standard C++ compiler on every platform Qt supports. It is based on the Meta-Object System that also provides inter-object communication via signals and slots.
[译文]:
QT提供了一个与某些编译器供应商提供的复杂属性系统相似的。但是,作为与编译器和平台无关的库,QT不依赖于__property或[属性]等非标准编译器功能。 QT解决方案可与每个平台QT支持的任何标准C ++编译器一起使用。它基于Meta-Object System,该系统还通过信号和插槽提供对象间通信。
🌟《Qt 5.9 C++开发指南》中的定义
Qt提供一个Q_PROPERTY()宏可以定义属性,它也是基于元对象系统实现的属性系统与C++编译器无关 用任何标准的C++编译器编译定义了属性的QtC++程序。
🌟 Qt中属性的使用
前提:只有QObject的派生类才能够使用属性系统。
下面演示的类是MainWindow继承于QMainWindow。而QMainWindow的类继承关系如下:
QMainWindow —> QWidget —> QObect and QPaintDevice
所以,MainWindow继承于QObject。
🌸 Q_PROPERTY宏的使用:
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])
- 静态属性范例:
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool isFixed() const;//
void setIsFixed(bool newIsFixed);
void resetIsFixed();
signals:
void isFixedChanged();
private:
Ui::MainWindow *ui;
bool m_isFixed = false;
// bool是返回值类型;
//isFixed是属性名;
//READ后面的isFixed是读取属性值关联的成员函数;
//WRITE后面的setIsFixed是设定属性值关联的成员函数;
//RESET后面的resetIsFixed是设置缺省值的成员函数;
//NOTIFY后面的isFixedChanged是当属性质发生变化时发出的关联成员信号函数。
Q_PROPERTY(bool isFixed READ isFixed WRITE setIsFixed RESET resetIsFixed NOTIFY isFixedChanged)
};
- 动态属性范例:
//QVariant 是Qt提供的万能类型,可以储存任意的数据类型。
void MainWindow::SetProperty(const QString &propertyName, const QVariant &property)
{
QObject::setProperty(propertyName.toStdString().data(),property);
}
QVariant MainWindow::GetProperty(const QString &propertyName) const
{
return property(propertyName.toStdString().data());
}
void MainWindow::Test(){
SetProperty("Size",QSize(250,250));//设置Size属性,它是一个动态属性
QSize size = GetProperty("Size").toSize();//返回Size属性值
}
通过SetProperty函数设置的属性,可以通过调用GetProperty函数来返回,并使用显式类型转换为原始的属性类型。