当前位置: 首页 > news >正文

【Qt开发流程】之对象模型2:属性系统

描述

Qt提供了一个复杂的属性系统,类似于一些编译器供应商提供的属性系统。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译器特性,如__property[property]
Qt解决方案适用于Qt支持的所有平台上的任何标准c++编译器。它基于元对象系统,该系统还通过信号和槽提供对象间通信。

声明属性要求

要声明属性,请在继承QObject的类中使用Q_PROPERTY()宏。
这个宏用于在继承QObject的类中声明属性。属性的行为类似于类数据成员,但它们具有可通过元对象系统访问的附加特性。

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])

声明需要属性名称和类型以及READ函数。该类型可以是QVariant支持的任何类型,也可以是用户定义的类型。其他项是可选的,但WRITE函数是常见的。除USER外,其他属性默认为false。

例如:

Q_PROPERTY(QString title READ title WRITE setTitle USER true)

下面是取自类QWidget的属性声明的一些典型示例:

Q_PROPERTY(bool focus READ hasFocus)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)

下面是一个示例,展示了如何使用member关键字将成员变量导出为Qt属性。注意,必须指定NOTIFY信号才能允许QML属性绑定:

   Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged)Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)...
signals:void colorChanged();void spacingChanged();void textChanged(const QString &newText);private:QColor  m_color;qreal   m_spacing;QString m_text;

属性表现类似于类数据成员,但通过元对象系统可访问附加功能。

  • 如果未指定MEMBER变量,则需要一个READ访问器函数。它用于读取属性值。理论上,应该使用const函数来实现,并且必须返回属性的类型或该类型的const引用。例如,QWidget::focus是一个带有READ函数(QWidget::hasFocus())的只读属性。
  • WRITE访问器函数是可选的。它用于设置属性值。它必须返回void,并且必须接受一个参数,要么是属性的类型,要么是指向该类型的指针或引用。例如,QWidget::enabled具有WRITE函数QWidget::setEnabled()。只读属性不需要WRITE函数。例如,QWidget::focus没有WRITE函数。
  • 如果未指定READ访问器函数,则需要一个MEMBER变量关联。这使得给定的成员变量可读可写,而无需创建READ和WRITE访问器函数。如果需要控制变量访问,仍然可以使用READ或WRITE访问器函数(但不能同时使用)。
  • RESET函数是可选的。它用于将属性设置回上下文特定的默认值。例如,QWidget::cursor具有典型的READ和WRITE函数(QWidget::cursor()和QWidget::setCursor()),它还有一个RESET函数QWidget::unsetCursor(),因为对QWidget::setCursor()的调用没有意义。RESET函数必须返回void并且不接受参数。
  • NOTIFY信号是可选的。如果定义了,它应指定该类中的一个现有信号,该信号在属性值更改时发出。MEMBER变量的NOTIFY信号必须接受零个或一个参数,该参数的类型必须与属性的类型相同。参数将采用属性的新值。只有在属性实际上发生更改时,才应该发出NOTIFY信号,以避免在QML中不必要地重新评估绑定,例如。当需要为未具有显式设置器的MEMBER属性自动发出该信号时,Qt会自动发出该信号。
  • REVISION编号是可选的。如果包含,则定义了属性及其通知器信号在API的特定修订版中使用(通常用于暴露给QML)。如果不包含,则默认为0。
  • DESIGNABLE属性指示属性是否应在GUI设计工具(例如Qt Designer)的属性编辑器中可见。大多数属性都是DESIGNABLE的(默认为true)。可以指定一个布尔成员函数代替true或false。
  • SCRIPTABLE属性指示该属性是否应由脚本引擎访问(默认为true)。您可以指定一个布尔成员函数代替true或false。
  • STORED属性指示该属性是否应被视为存在于自己或依赖于其他值上。它还指示在存储对象状态时是否必须保存属性值。大多数属性都是STORED的(默认为true),但是例如,QWidget::minimumWidth()的STORED为false,因为它的值只是从属性QWidget::minimumSize()的宽度组件中获取的,后者是一个QSize。
  • USER属性指示该属性是否指定为类的用户界面或可编辑属性。通常,每个类只有一个USER属性(默认为false)。例如,QAbstractButton::checked是(可检查)按钮的可编辑属性。请注意,QItemDelegate会获取和设置部件的USER属性。
  • CONSTANT属性的存在表示属性值是常量的。对于给定的对象实例,常量属性的READ方法在每次调用时必须返回相同的值。该常量值可以在对象的不同实例间有所不同。常量属性不能具有WRITE方法或NOTIFY信号。
  • FINAL属性的存在表示该属性不会被派生类覆盖。在某些情况下,这可以用于性能优化,但是不受moc的强制执行。永远不要覆盖FINAL属性。

可以继承READ、WRITE和RESET功能。它们也可以是虚拟的。当它们在使用多重继承的类中被继承时,它们必须来自第一个继承的类。

属性类型可以是QVariant支持的任何类型,也可以是用户定义的类型。在本例中,类QDate被认为是用户定义的类型。


Q_PROPERTY(QDate date READ getDate WRITE setDate)

因为QDate是用户定义的,所以必须包含 带有属性声明的头文件。

对于QMap、QList和QValueList属性,属性值是一个QVariant,其值是整个列表或映射。注意,Q_PROPERTY字符串不能包含逗号,因为逗号分隔了宏参数。因此,必须使用QMap作为属性类型,而不是QMap<QString,QVariant>。
为了保持一致性,也使用QList和QValueList而不是 QList和QValueList。

使用元对象系统对属性进行读写操作

可以使用泛型函数QObject::property()和QObject::setProperty()来读写属性,而不需要知道除了属性名称之外的任何关于所属类的信息。在下面的代码片段中,对QAbstractButton::setDown()的调用和对QObject::setProperty()的调用都设置属性“down”。

QPushButton *button = new QPushButton;
QObject *object = button;button->setDown(true);
object->setProperty("down", true);

通过WRITE访问属性是两种方法中更好的一种,因为它更快,并且在编译时提供更好的诊断,但是以这种方式设置属性要求您在编译时了解该类。按名称访问属性使您可以访问在编译时不知道的类。您可以在运行时通过查询类的QObject、QMetaObject和QMetaProperties来发现类的属性。

QObject *object = ...
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i=0; i<count; ++i) {QMetaProperty metaproperty = metaobject->property(i);const char *name = metaproperty.name();QVariant value = object->property(name);...
}

在上面的代码片段中,QMetaObject::property()用于获取在某个未知类中定义的每个属性的元数据。从元数据中获取属性名并传递给QObject::property()以获取当前对象中的属性值。

一个小示例

假设我们有一个类MyClass,它派生自QObject,并在其私有部分中使用Q_OBJECT宏。我们希望在MyClass中声明一个属性来跟踪优先级值。该属性的名称将是priority,其类型将是一个名为priority的枚举类型,该类型在MyClass中定义。

我们在类的私有部分使用Q_PROPERTY()宏声明属性。所需的READ函数名为priority,我们还包含了一个名为setPriority的WRITE函数。枚举类型必须使用Q_ENUM()宏在元对象系统中注册。注册枚举类型使枚举数名称可用于调用QObject::setProperty()。我们还必须为READ和WRITE函数提供自己的声明。MyClass的声明可能看起来像这样:

class MyClass : public QObject
{Q_OBJECTQ_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)public:MyClass(QObject *parent = 0);~MyClass();enum Priority { High, Low, VeryHigh, VeryLow };Q_ENUM(Priority)void setPriority(Priority priority){m_priority = priority;emit priorityChanged(priority);}Priority priority() const{ return m_priority; }signals:void priorityChanged(Priority);private:Priority m_priority;
};

READ函数是const,并返回属性类型。WRITE函数返回void,并且只有一个属性类型的参数。元对象编译器执行这些要求。

给定一个指向MyClass实例的指针或一个指向MyClass实例的QObject指针,我们有两种方法来设置其优先级属性:

MyClass *myinstance = new MyClass;
QObject *object = myinstance;myinstance->setPriority(MyClass::VeryHigh);
object->setProperty("priority", "VeryHigh");
qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << myinstance->property("priority");

在这里插入图片描述
当把

object->setProperty("priority", "VeryHigh");

改为

object->setProperty("priority", "VeryHi");

再次输出,会输出为空,会自行检查,是安全的。
在这个例子中,作为属性类型的枚举类型在MyClass中声明,并使用Q_ENUM()宏在元对象系统中注册。这使得枚举值可以作为字符串使用,就像在调用setProperty()时一样。如果枚举类型在另一个类中声明,则需要它的完全限定名(即OtherClass::Priority),并且其他类也必须继承QObject并使用Q_ENUM()宏在那里注册枚举类型。

还有一个类似的宏Q_FLAG()。像Q_ENUM()一样,它注册了一个枚举类型,但它将该类型标记为一组标志,即可以将值OR在一起。一个I/O类可能有枚举值Read和Write,然后QObject::setProperty()可以接受Read | Write。Q_FLAG()应该用来注册这个枚举类型。

动态属性

QObject::setProperty()也可用于在运行时为类的实例添加新属性。当使用名称和值调用它时,如果QObject中存在具有给定名称的属性,并且给定的值与属性的类型兼容,则该值将存储在属性中,并返回true。如果该值与属性的类型不兼容,则不会更改属性,并返回false。但是,如果具有给定名称的属性在QObject中不存在(即,如果它没有使用Q_PROPERTY()声明),则一个具有给定名称和值的新属性将自动添加到QObject中,但仍然返回false。这意味着不能使用返回false来确定是否实际设置了特定属性,除非您事先知道该属性已经存在于QObject中。

注意,动态属性是在每个实例的基础上添加的,也就是说,它们被添加到QObject,而不是QMetaObject。通过将属性名称和无效的QVariant值传递给QObject::setProperty(),可以从实例中删除属性。QVariant的默认构造函数构造了一个无效的QVariant。

动态属性可以用QObject::property()查询,就像在编译时用Q_PROPERTY()声明的属性一样。

属性和自定义类型

属性使用的自定义类型需要使用Q_DECLARE_METATYPE()宏注册,以便它们的值可以存储在QVariant对象中。这使得它们既适合与类定义中使用Q_PROPERTY()宏声明的静态属性一起使用,也适合与运行时创建的动态属性一起使用。

向类添加附加信息

连接到属性系统的是一个额外的宏Q_CLASSINFO(),它可以用来将额外的名值对附加到类的元对象上,例如:

Q_CLASSINFO("Version", "3.0.0")

与其他元数据一样,类信息可以在运行时通过元对象访问;详情可以参考QMetaObject::classInfo()

使用场景

  1. 自定义控件:通过属性系统,可以方便地添加自定义控件所需要的属性,并在运行时动态修改其属性值,以实现控件的个性化定制。

  2. 翻译:在多语言支持的应用程序中,可以将所有需要翻译的字符串作为属性添加到组件中,这样可以方便地将这些字符串全部翻译成不同的语言。

  3. 皮肤定制:通过属性系统,可以在运行时动态地修改控件的样式属性,以实现界面的不同皮肤定制。
    比如改变样式:

{// 创建QPushButton控件QPushButton *button = new QPushButton("Click me", this);// 添加样式属性button->setProperty("buttonColor", QColor(220, 220, 220));button->setProperty("buttonTextColor", QColor(50, 50, 50));// 设置初始样式setButtonStyle(button);// 在运行时修改样式属性button->setProperty("buttonColor", QColor(0, 255, 0));button->setProperty("buttonTextColor", QColor(255, 0, 0));setButtonStyle(button); // 重新设置样式
}// 定义函数来根据样式属性设置样式表
void setButtonStyle(QPushButton* button) {QColor buttonColor = button->property("buttonColor").value<QColor>();QColor buttonTextColor = button->property("buttonTextColor").value<QColor>();button->setStyleSheet(QString("QPushButton { background-color: rgb(%1, %2, %3); color: rgb(%4, %5, %6); }").arg(buttonColor.red()).arg(buttonColor.green()).arg(buttonColor.blue()).arg(buttonTextColor.red()).arg(buttonTextColor.green()).arg(buttonTextColor.blue()));
}

在这里插入图片描述

属性系统的优势

  1. 灵活性:通过属性系统,可以轻松地在运行时动态修改对象的属性值,从而实现动态控制组件的行为。

  2. 扩展性:开发人员可以轻松地为自定义的控件添加属性,并通过属性系统来进行控制,从而扩展控件的属性和功能。

  3. 易用性:Qt属性系统提供了简单易用的API,开发人员可以方便地使用属性系统来管理和操作对象的属性。

结论

年轻人嘛,现在没钱算什么,以后没钱的日子还多着呢

相关文章:

【Qt开发流程】之对象模型2:属性系统

描述 Qt提供了一个复杂的属性系统&#xff0c;类似于一些编译器供应商提供的属性系统。然而&#xff0c;作为一个独立于编译器和平台的库&#xff0c;Qt不依赖于非标准的编译器特性&#xff0c;如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…...

PHP之curl详细讲解

cURL&#xff08;全称为Client for URLs&#xff09;是一个功能强大的开源库&#xff0c;用于在多种协议上进行数据传输、发送HTTP请求和获取响应。它支持多种协议&#xff0c;包括HTTP、HTTPS、FTP、SMTP等&#xff0c;并且能够与各种服务器进行通信。 cURL库可以通过命令行工…...

R语言30分钟上手

文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…...

上下拉电阻会增强驱动能力吗?

最近看到一个关于上下拉电阻的问题&#xff0c;发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下&#xff0c;大家一致认为不存在上下拉电阻增强驱动能力这回事&#xff0c;因为除了OC输出这类特殊结构外&#xff0c;上下拉电阻就是负载&#xff0c;只会减…...

题目:小明的彩灯(蓝桥OJ 1276)

题目描述&#xff1a; 解题思路&#xff1a; 一段连续区间加减&#xff0c;采用差分。最终每个元素结果与0比较大小&#xff0c;比0小即负数输出0。 题解&#xff1a; #include<bits/stdc.h> using namespace std;using ll long long; const int N 1e5 10; ll a[N],…...

换元法求不定积分

1.一般步骤&#xff1a;选取换元对象&#xff08;不一定是式子中的值&#xff0c;也可以是式子中的最小公倍数或者最大公因数&#xff09;&#xff0c;然后将dx换为dt*t的导数&#xff0c;再用t将原式表示&#xff0c;化简计算即可 2. 3. 4. 5. 6....

在Docker容器中启用SSH服务,实现外部访问的详细教程

目录 步骤 1: 安装 SSH 服务器 步骤 2: 配置 SSH 服务器 步骤 3: 设置 SSH 用户 步骤 4: 重启 SSH 服务器 步骤 5: 映射容器端口 步骤 6: 使用 SSH 连接到容器 要在Docker容器中启用SSH服务&#xff0c;以便从外部访问&#xff0c;您需要执行以下步骤&#xff1a; 步骤 …...

Go 模块系统最小版本选择法 MVS 详解

目录 Golang 模块系统简介 包版本管理 最小版本选择&#xff08;MVS&#xff09;原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性&#xff0c;主要目的是解决 Go 项目中的依赖管理问题。在模…...

ifstream读取txt中的中文数据转成QString出现乱码

使用ifstream从txt文本中读取中文数据到string&#xff0c;再将string转成QString输出时出现了乱码。 分析&#xff1a;如果ifstream能成功从txt文本中读出中文数据&#xff0c;那大概率txt用的编码是ANSI编码&#xff08;GBK就是ANSI的一种&#xff09;&#xff0c;那么在转成…...

UE4 双屏分辨率设置

背景&#xff1a; 做了一个UI 应用&#xff0c;需要在双屏上进行显示。 分辨率如下&#xff1a;3840*1080&#xff1b; 各种折腾&#xff0c;其实很简单&#xff1a; 主要是在全屏模式的时候 一开始没有选对&#xff0c;双屏总是不稳定。 全屏模式改成&#xff1a;Windows 之…...

$sformat在仿真中打印文本名的使用

在仿真中&#xff0c;定义队列&#xff0c;使用任务进行函数传递&#xff0c;并传递文件名&#xff0c;传递队列&#xff0c;进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串&#xff0c;在仿真的时候进行文件…...

【Rust】结构体与枚举

文章目录 结构体struct基础用法使用字段初始化简写语法使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体方法语法关联函数多个 impl 块 枚举枚举值Option 结构体struct 基础用法 一个存储用户账号信息的结构体&#xff1a; struct User {active: bo…...

CentOS7 防火墙常用命令

以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令&#xff1a; 检查防火墙状态&#xff1a; sudo firewall-cmd --state 启动防火墙&#xff1a; sudo systemctl start firewalld 停止防火墙&#xff1a; sudo systemctl stop firewalld 重启防火墙&…...

【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目

什么是UL9540测试&#xff0c;UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室&#xff08;Underwriters Laboratories&#xff09;发布的标准&#xff0c;名称为"UL 9540: Energy Storage Systems and Equipment"&#xff0c;翻译为中文为"能量存储…...

springcloud整合Oauth2自定义登录/登出接口

我使用的是password模式&#xff0c;并配置了token模式 一、登录 (这里我使用的示例是用户名密码认证方式) 1. Oath2提供默认登录授权接口 org.springframework.security.oauth2.provider.endpoint.postAccess; Tokenpublic ResponseEntity<OAuth2AccessToken> pos…...

Oracle常见内置程序包的使用Package

Oracle常见内置程序包的使用 点击此处可跳转至&#xff1a;Oracle的程序包(Package)&#xff0c;对包的基础进行学习常见内置程序包的使用Package1、DBMS_OUTPUT包2、DBMS_XMLQUERY包3、DBMS_RANDOM包4、UTL_FILE包5、DBMS_JOB包6、DBMS_LOB包7、DBMS_SQL包8、DBMS_LOCK包9、DB…...

Flutter:视频下载案例

前言 最近在研究视频下载&#xff0c;因此打算一边研究一边记录一下。方便以后使用时查看。 使用到的库有&#xff1a; permission_handler 11.1.0 &#xff1a;权限请求 flutter_downloader 1.11.5&#xff1a;文件下载器 path_provider 2.1.1&#xff1a;路径处理 视频…...

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南 第2章&#xff1a;指令提示技术 现在&#xff0c;让我们开始探索“指令提示技术”&#xff0c;以及如何使用它从ChatGPT生成高质量的文本。 指令提示技术是一种通过为模型提供特定指令来指导ChatGPT输出的方…...

JDK 历史版本下载以及指定版本应用

参考&#xff1a; 官网下载JAVA的JDK11版本&#xff08;下载、安装、配置环境变量&#xff09;_java11下载-CSDN博客 Gradle&#xff1a;执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里&#xff0c;但是我们要下载历史版本 选…...

Linux基础项目开发1:量产工具——UI系统(五)

前言&#xff1a; 前面我们已经把显示系统、输入系统、文字系统搭建好了&#xff0c;现在我们就要给它实现按钮操作了&#xff0c;也就是搭建UI系统&#xff0c;下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…...

面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题

面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 面试就是这么简单&#xff0c;offer拿到手软&#xff08;三&#xff…...

深入理解Redis分片策略:提升系统性能的关键一步

目录 引言 1. 一致性哈希算法 2. 范围分片 3. 哈希槽分片 实战经验分享 结论 引言 Redis作为一款高性能的键值存储系统&#xff0c;为了应对大规模数据和高并发的访问&#xff0c;引入了分片策略&#xff0c;使得数据能够分布存储在多个节点上&#xff0c;实现系统的横向…...

【数据结构(七)】查找算法

文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中&#xff0c;我们…...

Android画布Canvas绘制drawBitmap基于源Rect和目的Rect,Kotlin

Android画布Canvas绘制drawBitmap基于源Rect和目的Rect&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns…...

深度优先搜索LeetCode979. 在二叉树中分配硬币

给你一个有 n 个结点的二叉树的根结点 root &#xff0c;其中树中每个结点 node 都对应有 node.val 枚硬币。整棵树上一共有 n 枚硬币。 在一次移动中&#xff0c;我们可以选择两个相邻的结点&#xff0c;然后将一枚硬币从其中一个结点移动到另一个结点。移动可以是从父结点到…...

C++学习之路(十)C++ 用Qt5实现一个工具箱(增加一个时间戳转换功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《JSON数据格式化》功能&#xff0c;还是比较实用的。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加一个平时经常用到的功能吧&#xff0c;就是「 时间戳转换 」功能&#xff0c;而且实现点击按钮后文字进行变…...

Linux 5.15安全特性之ARM64 PAC

ARM64 PAC&#xff08;Pointer Authentication Code&#xff09;机制是ARM架构中引入的一种安全特性&#xff0c;旨在提供指针的完整性和安全性保护。它通过在指针中插入一段额外的代码进行签名&#xff0c;以验证指针的完整性&#xff0c;从而抵御缓冲区溢出和代码注入等攻击。…...

同旺科技 分布式数字温度传感器

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…...

状态空间的定义

状态空间是描述一个系统所有可能状态的集合。在系统理论、控制论、计算机科学、强化学习等领域&#xff0c;状态空间是一种常见的概念。 状态空间框架是一种用于描述和分析系统的方法&#xff0c;它包括系统的状态、状态之间的转移关系以及与状态相关的行为。下面详细解释状态…...

数据挖掘实战-基于word2vec的短文本情感分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

20种推广方式/厦门seo网站推广

Linux下使用最广泛的C/C编译器是GCC&#xff0c;大多数的Linux发行版本都默认安装&#xff0c;不管是开发人员还是初学者&#xff0c;一般都将GCC作为Linux下首选的编译工具。本教程毫不犹豫地使用GCC来编译C程序。 首先检查系统是否安装GCC 以及make gcc -v make -v运行结果…...

杭州网站建设设计制作/关键词百度指数查询

被tkj大爷艹爆了5555整套模拟赛都是神仙思路题 那么这题题解 还有一个神仙做法&#xff0c;zory巨神在考场上找规律AC&#xff0c;自己都不会证。。我证明了一下(然而这货还是不认可自己的做法) 按照分割点的思路&#xff0c;我们for循环一次&#xff0c;每次找到比当前点小且最…...

观澜专业做网站公司/百度竞价推广点击软件

match 最简单的一个match例子&#xff1a; 查询和"我的宝马多少马力"这个查询语句匹配的文档。 {"query": {"match": {"content" : {"query" : "我的宝马多少马力"}}} }上面的查询匹配就会进行分词&#xff0c…...

wordpress 同步/2022社会热点事件及看法

3.2 数据挖掘建模过程 广州TipDM团队在多年的数据挖掘项目实施过程中&#xff0c;积累了一套行之有效的数据挖掘方法论&#xff0c;数据挖掘建模过程如图3-2所示。 3.2.1 定义挖掘目标 针对具体的数据挖掘应用需求&#xff0c;首先要非常清楚&#xff1a;本次的挖掘目标是什么&…...

代做设计网站好/企业培训课程名称

一、IPO模型一个程序&#xff0c;按照功能可以划分为三个部分&#xff1a;输入部分、处理部分和输出部分本讲我们学习基本输入与输出&#xff0c;通过输入函数获取数据(数值型和字符串)&#xff0c;通过输出函数将处理结果以某种方式呈现。处理部分会涉及到各种各样的运算&…...

网站开发专业培训/百度推广怎么联系

发布时间&#xff1a;2016-06-28注意:乐谱触发有先后顺序,两个乐谱事件不能同时触发.满足触发条件后,在出自家门时会发生寻找乐谱事件. 1 音階の基礎条件:一年春17日 位置:ダンヒル家床边. 效果:树林区域跳跃蘑菇使用可能.(从小镇北部进入 ...标签&#xff1a;牧场物语攻…...