QObject_other

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

#define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__)class A:public QObject
{Q_OBJECT
public: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;
}

bool setProperty(const char *name, const QVariant &value)

如果属性是Q_PROPERTY定义的,设置属性值成功返回true,否则返回false
如果属性不是Q_PROPERTY定义的,则动态的新增属性并且返回false

bool QObject::setProperty(const char *name, const QVariant &value)
{Q_D(QObject);const QMetaObject* meta = metaObject();//获取元对象if (!name || !meta)return false;int id = meta->indexOfProperty(name);//元对象中查找静态属性if (id < 0) {if (!d->extraData)d->extraData = new QObjectPrivate::ExtraData;const int idx = d->extraData->propertyNames.indexOf(name);//静态属性没找到,在动态设置的属性里面找if (!value.isValid()) {if (idx == -1)return false;d->extraData->propertyNames.removeAt(idx);d->extraData->propertyValues.removeAt(idx);} else {if (idx == -1) { //动态设置的属性里面也没有找到d->extraData->propertyNames.append(name);//新增属性d->extraData->propertyValues.append(value);//新增属性值} else {//动态设置的属性里面找到了if (value.userType() == d->extraData->propertyValues.at(idx).userType()&& value == d->extraData->propertyValues.at(idx))return false;d->extraData->propertyValues[idx] = value;//修改属性值}}QDynamicPropertyChangeEvent ev(name);QCoreApplication::sendEvent(this, &ev);//发送QDynamicPropertyChangeEvent事件return false;//新增动态属性始终返回false}//静态属性直接修改其值QMetaProperty p = meta->property(id);return p.write(this, value);
}

QList dynamicPropertyNames() const

返回所有使用setProperty动态新增的属性名称列表

int senderSignalIndex()

返回调用当前执行槽的信号的元方法索引,它是sender()返回的类的成员。
应该在槽函数中调用,如果在由信号激活的槽之外调用,则返回-1。
对于带有默认参数的信号,此函数将始终返回带有所有参数的索引,而不管connect()使用了哪个参数。
例如,被销毁的信号(QObject *obj = nullptr)将有两个不同的索引(带参数和不带参数),但这个函数将始终返回带参数的索引。
这不适用于重载具有不同参数的信号。
警告:这个函数违反了面向对象的模块化原则。但是,当许多信号连接到单个槽时,访问信号索引可能很有用。
警告:当通过Qt::DirectConnection从不同于此对象线程的线程调用槽时,此函数的返回值无效。不要在这种场景中使用此函数。
这个函数是在Qt 4.8中引入的。

int receivers(const char* signal) const

返回连接到该信号的接收器的数量。
由于插槽和信号都可以用作信号的接收器,并且可以多次进行相同的连接,因此接收器的数量与从该信号进行连接的数量相同。

if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) {
QByteArray data;
get_the_value(&data); // expensive operation
emit valueChanged(data);
}

bool inherits(const char *classname)

返回是否直接或间接继承了className类,是则返回true;否则返回false。
一个类被认为继承了它自己。
QTimer *timer = new QTimer; // QTimer inherits QObject
timer->inherits(“QTimer”); // returns true
timer->inherits(“QObject”); // returns true
timer->inherits(“QAbstractButton”); // returns false

// QVBoxLayout:public QObject ,public QLayoutItem{};
QVBoxLayout *layout = new QVBoxLayout;
layout->inherits(“QObject”); // returns true
layout->inherits(“QLayoutItem”); // returns true (even though QLayoutItem is not a QObject)

bool isSignalConnected(const QMetaMethod &signal)

如果信号连接到至少一个接收器,则返回true,否则返回false
Signal必须是该对象的信号成员,否则行为未定义。
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
QByteArray data;
data = get_the_value(); // expensive operation
emit valueChanged(data);
}

void deleteLater()

计划删除此对象,当控制返回到事件循环时,对象将被删除
如果在调用此函数时事件循环没有运行(例如,在QCoreApplication::exec()之前在对象上调用deleteLater()),则一旦事件循环启动,该对象将被删除。
如果在主事件循环停止后调用deleteLater(),则不会删除对象。
自Qt 4.8以来,如果deleteLater()在没有运行事件循环的线程中的对象上调用,则该对象将在线程结束时被销毁。
注意,进入和离开一个新的事件循环(例如,通过打开一个模态对话框)不会执行延迟删除;对于要删除的对象,控件必须返回到从中调用deleteLater()的事件循环。
注意:多次调用这个函数是安全的;当交付第一个延迟删除事件时,对象的任何挂起事件都将从事件队列中删除。


void QObject::deleteLater()
{QCoreApplication::postEvent(this, new QDeferredDeleteEvent());
}bool QObject::event(QEvent *e)
{case QEvent::DeferredDelete:qDeleteInEventHandler(this);break; 
}void qDeleteInEventHandler(QObject *o)
{delete o;
}

static uint registerUserData()

注册用户数据类型,返回此类型id号

static QBasicAtomicInteger<uint> user_data_registration = Q_BASIC_ATOMIC_INITIALIZER(0);uint QObject::registerUserData()
{return user_data_registration.fetchAndAddRelaxed(1);
}

void setUserData(uint id, QObjectUserData* data)

设置对应id的用户数据类型的数据,数据必须是指针且不需要自己手动释放

void QObject::setUserData(uint id, QObjectUserData* data)
{Q_D(QObject);if (!d->extraData)d->extraData = new QObjectPrivate::ExtraData;if (d->extraData->userData.size() <= (int) id)d->extraData->userData.resize((int) id + 1);d->extraData->userData[id] = data;//用户数据是一个数组,里面保存不同类型的用户数据
}

QObjectUserData* userData(uint id) const

获取用户数据

QObjectUserData* QObject::userData(uint id) const
{Q_D(const QObject);if (!d->extraData)return nullptr;if ((int)id < d->extraData->userData.size())return d->extraData->userData.at(id);return nullptr;
}

userData自动析构

对象析构时自动析构释放所有用户数据

QObjectPrivate::~QObjectPrivate()
{if (extraData)qDeleteAll(extraData->userData);delete extraData;
}template <typename Container>
inline void qDeleteAll(const Container &c)
{qDeleteAll(c.begin(), c.end());
}void qDeleteAll(ForwardIterator begin, ForwardIterator end)
{while (begin != end) {delete *begin;//删除所有用户数据,对于用户数据里面含有指针的类型,有数据本身析构释放++begin;}
}
ainer &c)
{qDeleteAll(c.begin(), c.end());
}void qDeleteAll(ForwardIterator begin, ForwardIterator end)
{while (begin != end) {delete *begin;//删除所有用户数据,对于用户数据里面含有指针的类型,有数据本身析构释放++begin;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第七十三期】Tue, 9 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 9 Jan 2024 Totally 80 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers FFSplit: Split Feed-Forward Network For Optimizing Accuracy-Efficiency Trade-off in Language Model Infe…

LeetCode-2645. 构造有效字符串的最少插入数

给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串有效 。 示例 1&#xff1a; 输入&#xff1a;word “b” …

centos7上升级mysql8.0.21到mysql8.0.35版本

1、下载安装包 cd /home/soft/mysql8.0.35 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.35-1.el7.x86_64.rpm-bundle.tar 2、解压压缩包 3、停止掉mysqld服务 systemctl stop mysqld 4、强制安装新的版本包 rpm -ivh mysql-community-common-8.0.35-1.el…

Fluids —— Whitewater (SOP)

目录 Whitewater Lifecycle Workflow Whitewater source Deformation sources Visualizing whitewater Whitewater solver Wind Foam erosion Repellants Whitewater postprocess 基于SOP的白水是对SOP FLIP工作流的增强&#xff1b;该系统与规模无关&#xff0c;无需…

重温大学时奋斗的20条

重温大学时奋斗的20条 一.即哈佛训言20条。二.行稳致远体会对未来说的话 一.即哈佛训言20条。 1.This moment will nap, you will have a dream; But this moment study,you will interpret a dream. 此刻打盹&#xff0c;你将做梦&#xff1b;而此刻学习&#xff0c;你将圆梦。…

【开题报告】基于Servlet的湖南特产销售系统的设计与实现

1.选题背景 湖南是一个地理文化区域&#xff0c;拥有丰富的特产资源&#xff0c;如岳阳橘、衡山豆腐干、张家界辣椒等。随着互联网的发展&#xff0c;电子商务在特产销售领域扮演着越来越重要的角色。为了促进湖南特产销售业的发展&#xff0c;设计并实现一个基于Servlet的湖南…

k8s--集群调度(kube-scheduler)

了解kube-scheduler 由之前博客可知kube-scheduler是k8s中master的核心组件之一 scheduler&#xff1a;负责调度资源。把pod调度到node节点。他有两种策略&#xff1a; 预算策略&#xff1a;人为部署&#xff0c;指定node节点去部署新建的pod 优先策略&#xff1a;通过算法选…

js逆向第16例:猿人学第12题入门级js

文章目录 一、前言二、定位关键参数三、代码实现一、前言 任务:抓取这5页的数字,计算加和并提交结果 既然是入门级,那肯定很简单了 二、定位关键参数 控制台查看请求数据,m值应该就是关键参数了 进入堆栈 马上定位到了m值"m": btoa(yuanrenxue + window.pag…

解锁React中条件渲染的全面指南

React中的条件渲染全面指南 条件渲染是React中的一项强大功能,它允许开发人员根据某些条件来控制组件的显示。它在创建动态和交互式用户界面中发挥着至关重要的作用。但是,理解React中的条件渲染的工作原理以及掌握其实现可能对开发人员具有挑战性,特别是那些刚接触该框架的人…

JVM加载class文件的原理机制

1、JVM 简介 JVM 是我们Javaer 的最基本功底了&#xff0c;刚开始学Java 的时候&#xff0c;一般都是从“Hello World ”开始的&#xff0c;然后会写个复杂点class &#xff0c;然后再找一些开源框架&#xff0c;比如Spring &#xff0c;Hibernate 等等&#xff0c;再然后就开发…

Spacedesk | 最新版本移动端扩展PC副屏

我的设备&#xff1a; 电脑:戴尔G15 5511、i7-11800H、Windows 11、RTX3060&#xff08;推荐显卡高级一些&#xff0c;算力差点的可能带不动这款软件&#xff09; 平板&#xff1a;荣耀V6、麒麟985、安卓10、分辨率2000*1200&#xff08;手机也行&#xff0c;我用的平板&…

图片双线性插值原理解析与代码 Python

一、原理解析 图片插值是图片操作中最常用的操作之一。为了详细解析其原理&#xff0c;本文以 33 图片插值到 55 图片为例进行解析。如上图左边蓝色方框是 55 的目标图片&#xff0c;右边红色方框是 33 的源图片。上图中&#xff0c;蓝/红色方框是图片&#xff0c;图片中的蓝/红…

行为型模式 | 观察者模式

一、观察者模式 1、原理 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象&#xff0c;这个主题对象在状态上发生变化时&#xff0c;会通知所有观察者对象&#xff0…

容灾演练双月报|DRCC助力中韩人寿完成核心系统年度演练任务

了解更多灾备行业动态 守护数字化时代业务连续 目录 CONTENTS 01 灾备法规政策 02 热点安全事件 03 容灾演练典型案例 01 灾备法规政策 2023年12月&#xff0c;工信部和国标委联合发布《工业领域数据安全标准体系建设指南&#xff08;2023版&#xff09;》&#xff0…

兔子目标检测数据集VOC格式340张

兔子&#xff0c;一种温顺而可爱的哺乳动物&#xff0c;以其独特的形态和特点而受到人们的喜爱。 兔子的体型小巧&#xff0c;通常呈圆锥形&#xff0c;有着柔软的毛发和圆溜溜的眼睛。它们的耳朵长而直立&#xff0c;能够听到细微的声音。兔子的前肢较短&#xff0c;后肢较长…

2023年中国产业格局巨变:电子行业崛起、新能源汽车崭露头角,500强企业大揭秘!

随着2023年的收官&#xff0c;最新中国公司500强市值排行榜也火热出炉。受地缘政治、全球经济下行等影响&#xff0c;本次榜单发生明显变化。台积电超越腾讯控股排名第一&#xff0c;共有76家新面孔跻身500强。具体来看&#xff0c;这些“明星企业”都集中在哪些行业&#xff1…

基于知识图谱的健康知识问答系统

基于知识图谱的健康知识问答系统 引言数据集与技术选型数据集技术选型 系统功能与实现数据导入与图数据库构建问答任务设计与实现1. 实体提取2. 用户意图识别 前端聊天界面与问答系统 结语 引言 随着互联网的发展&#xff0c;人们对健康知识的需求逐渐增加。为了更方便地获取健…

模型评估:余弦距离的应用

其实在模型训练过程中&#xff0c;我们在不断地评估着样本间的距离&#xff0c;如何评估样本距离也是定义优化目标和训练方法的基础。 在机器学习问题中&#xff0c;通常将特征表示为向量的形式&#xff0c;所以在分析两个特征向量之间的相似性时&#xff0c;常使用余弦相似度…

Demo: 给图片添加自定义水印并下载

给图片添加自定义水印并下载 <template><div class"wrap"><div class"optea"><div class"file-upload"><p>选择图片</p><el-button type"text" style"color: #c00;"><label f…

微信小程序swiper实现层叠轮播图

在微信小程序中,需要实现展示5个&#xff0c;横向层叠的轮播图效果&#xff0c;轮播图由中间到2侧的依次缩小.如下图 使用原生小程序进行开发,没有使用Skyline模式&#xff0c;所以layout-type配置项也无效。所以基于swiper组件进行调整。 主要思路就是设置不同的样式&#xff…