【属性系统概述】


在这里插入图片描述

🌟 静态属性与动态属性

  • 静态属性 :在创建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函数来返回,并使用显式类型转换为原始的属性类型。

在这里插入图片描述

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
第1章 数据库系统概述 【考试目的】   考核考生对数据模型、数据库、数据库系统体系结构、数据库管理系统、数据库系 统以及关系、关系模型、关系数据库等基本概念理解的情况。 【考试的知识点】 1.上述常用的数据库术语。 2.数据库系统的特点。 3.关系、属性、元组和键码。 4.数据库系统运行的大致过程。 【考试要求】 理解:数据库常用的基本概念。 理解:数据库系统的特点。 理解:数据库系统运行的大致过程。 基本掌握:简单关系的属性、元组和键码。 第2章 数据库建模 【考试目的】   考核考生对数据库建模的两种基本方法掌握的程度以及对键码和引用完整性这两个 基本概念理解的情况。 【考试的知识点】 1.对象定义语言:面向对象的设计;类的说明;ODL中的属性、联系及其反向联系;联 系的三种类型。 2.实体--联系模型(E/R图):E/R图中联系的三种类型;联系的多向性。 3.设计原则。 4.子类:ODL中的子类和继承;E/R图中的子类和继承。 5.对约束的建模:键码、单值约束、引用完整性。 【考试要求】 理解:数据库建模的基本原则。 理解:子类的继承性。 理解:主键码、外键码以及引用完整性。 熟练掌握:用对象定义语言(ODL)建立简单的数据库模型。 熟练掌握:用实体--联系模型(E/R图)建立简单的数据库模型。 初步掌握:用ODL和E/R图表示子类的方法。 第3章 关系模型和关系运算 【考试目的】  考核考生对关系模型中基本概念的理解情况,对ODL设计和E/R图转换为关系设计的掌 握情况以及用关系代数、关系演算和关系逻辑表达查询的能力。 【考试的知识点】 1.关系模型的基本概念:属性、域、元组、模式。 2.ODL设计转换为关系设计:ODL属性(包括非原子属性)的转换;单值、多值联系及反 向联系的转换;ODL子类的转换。 3.E/R图转换为关系设计:实体集的转换;联系的转换?quot;属于"联系的转换。 4.关系代数:关系的集合运算;投影、选择、笛卡尔积、自然连接、θ连接、改名等基 本运算; 复合运算。 5.关系演算:元组关系演算;域关系演算。 6.关系逻辑:谓词和原子;规则和查询;从关系代数到数据逻辑。 【考试要求】 理解:关系模型的基本概念。 熟练掌握:ODL设计转换为关系设计。 熟练掌握:E/R图设计转换为关系设计。 熟练掌握:用关系代数表达式表达查询要求。 基本掌握:用关系演算表达式表达查询要求。 基本掌握:用关系逻辑表达式(数据逻辑规则)表达查询要求。 第4章 数据库语言SQL 【考试目的】   考核考生用结构化查询语言SQL表达查询要求、进行数据库更新以及定义关系模式的 能力。 【考试的知识点】 1.SQL的特点。 2.简单查询:选择条件、排序输出、聚合运算以及分组处理。 3.连接查询:查询的并、交、差;连接与笛卡尔积;元组变量。 4.嵌套查询:产生单值的子查询;涉及到关系的选择条件;涉及到元组的选择条件;相 关子查询。 5.数据库更新:插入、删除、修改。 6.定义关系模式:定义表、撤消表;更改关系模式;建立和撤消索引。 7.视图:定义视图、查询视图、更新视图、撤消视图。 【考试要求】 熟练掌握:用SQL语句表达简单查询、连接查询。 熟练掌握:用SQL语句表达涉及排序输出、聚合运算以及分组处理的查询。 熟练掌握:用SQL语句表达数据库的更新。 熟练掌握:定义基本表、建立索引。 基本掌握:用SQL语句表达嵌套查询。 初步掌握:定义视图、查询视图。 第5章 查询优化和并发控制 【考试目的】   考核考生对查询优化的策略、方法和步骤理解和掌握的情况以及对并发控制的有关 协议的理解情况。 【考试的知识点】 1.查询优化的一般策略。 2.关系代数的等价变换规则。 3.查询优化的主要步骤。 4.并发调度:事务、数据不一致性、可串行化调度。 5.封锁协议:三级封锁协议、两段锁协议。 【考试要求】 理解:查询优化的必要性以及优化的一般策略。 理解:事务的概念。 理解:并发操作可能带来的数据不一致现象。 理解:可串行化调度。 基本掌握:用关系代数等价变换规则对查询表达式进行优化。 基本掌握:结合查询优化过程画出原始的和优化的语法树。 初步掌握:用三级封锁协议解决并发操作中的数据不一致问题。 初步掌握:用两段锁协议保证并发操作的可串行化。 第6章 关系数据库设计理论 【考试目的】   考核考生对关系模式设计中可能出现的问题及其产生原因以及解决的途径、分解的 原则和方法的理解和掌握的情况。 【考试的知识点】 1.函数依赖:函数依赖的定义;关系的键码和超键码;函数依赖规则;计算属性的封闭 集。 2.关系模式设计:可能出现的问题;问题产生的根源;解决的途径;分解的原则;分解 的方法;第一、二、三、BC范式。 3.多值依赖:属性独立性带来冗余;多值依赖
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛狂的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值