首页 > 其他分享 >Qt 元对象系统

Qt 元对象系统

时间:2023-07-16 15:36:30浏览次数:37  
标签:返回 Widget metaObject Qt 对象 系统 QObject name

1、QObject是所以使用元对象系统的类的基类,必须在类的开头使用Q_OBJECT宏才能使用元对象系统的特性。

2、元对象编译器MOC是一个预处理器。

3、元对象是对类的描述,包含类信息、方法、属性等元数据。

 

QObject类:

1、元对象(meta object):

每个QObject子类的实例都是一个元对象(静态变量staticMetaObject),函数metaObject()可以返回它的指针。

2、类型信息:QObject的inherits()函数可以判断继承关系。

3、动态翻译:函数tr()返回一个字符串的翻译版本。

4、对象树:表示对象间从属关系的树状结构。QObject提供了parent()、children()、findChildren()等函数。对象树中的某个对象被删除时,它的子对象也将被删除。

5、信号与槽:对象间的通信机制。

6、属性系统:可以使用宏Q_PROPERTY定义属性,QObject的setProperty()会设置属性的值或定义动态属性;property()函数会返回属性的值。

 

QMetaObejct类:

    QObject* object = new QPushButton;
    
    //QObject::metaObject()返回类关联的元对象。
    qDebug() << object->metaObject()->className();   //返回"QPushButton"
    
    QPushButton* pushbtn = qobject_cast<QPushButton*>(object);
    qDebug() << pushbtn->metaObject()->className();   //返回"QPushButton"
    
    //inherits()函数返回继承关系
    qDebug() << pushbtn->inherits("QObject");   //返回 true。pushbtn是继承自QObject
    qDebug() << pushbtn->inherits("QTimer");   //返回 false
    
    //superClass()函数返回父类的元对象
    qDebug() << object->metaObject()->superClass()->className();   //返回"QAbstractButton"

    object->setProperty("name", "tingtaishou");
    QString name = object->property("name").toString();

    const QMetaObject* meta = object->metaObject();
    int index = meta->indexOfProperty("name");
    QMetaProperty prop = meta->property(index);
    bool res = prop.isWritable();
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

    Q_CLASSINFO("author","tingtaishou")
    Q_CLASSINFO("version","1.0.0")

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QMetaProperty>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->metaObject()->classInfo(0).name();
    this->metaObject()->classInfo(0).value();
    this->metaObject()->classInfo(1).name();
    this->metaObject()->classInfo(1).value();
}

Widget::~Widget()
{
    delete ui;
}

 

信号与槽:

 

 

 

 

对象树:

 

 

 

 

元对象应用场景:

1、当一个窗口中有很多同类型的对象时,我们不需要将每个对象都写一个信号与槽,只需将所有对象都连接到同一个槽函数中,并在改槽函数中获取发送信号的对象(sender()函数),进而获取每个对象在创建时设置的不同的属性(ui->label_boy->setProperty("sex","boy"))从而区分不同的对象

 

标签:返回,Widget,metaObject,Qt,对象,系统,QObject,name
From: https://www.cnblogs.com/tingtaishou/p/17557853.html

相关文章

  • day07 7.1 Java中的面向对象之类与对象
    day077.1Java中的面向对象之类与对象【一】类与对象【1】类定义规范类与对象的关系类是实体对象的概念模型,笼统的,不具体的,比如人类、动物类、鸟类对象又称为实体,类具体化的表现小红/小明小猫一号/小狗一号对象中有属性,有方法不同对象属性是独有的方法是共......
  • JavaScript:将对象数组映射到字典
    JavaScript:将对象数组映射到字典#javascript#打字稿#数据在JavaScript/TypeScript中将对象数组转换为字典的最简单方法:letdata=[{id:1,country:'Germany',population:83623528},{id:2,country:'Austria',population:8975552},{id:3,country......
  • 编写一个函数,判断 string 对象中是否含有大写字母。编写另-个函数,把 string 对象全都
    第一个函数的任务是判断string对象中是否含有大写字母,无须修改参数的内容,因此将其设为常量引用类型。第二个函数需要修改参数的内容,所以应该将其设定为非常量引用类型。满足题意的程序如下所示:#include<iostream>#include<Windows.h>usingnamespacestd;boolhasUpper(......
  • 五分钟了解制造业核心系统的双向集成
    大家好,我是Edison。上一篇,我们了解制造行业核心的5大系统MES、ERP、WMS、PLM和SCADA是如何连接从而实现数据共享的。本篇,我们来了解一下制造行业工业软件的集成,一是纵向的集成,二是横向的集成。信息系统集成图片来源:后厂造上图粗略描述了制造行业工业软件信息系统在横向和纵向......
  • vsphere上redhat7.5系统安装
    Redhat7.5系统安装参考需求:安装redhat7.5,给2CPU,40G磁盘空间,4G内存,IP地址为5.19、5.20,网关5.1 步骤如下:1.选择需要将虚拟机安装的主机选中IP-->单击文件-->新建-->新建虚拟机 2.选择配置类型选择典型模式即可 3.虚拟机名称虚拟机一般命名规则:用......
  • 大数据生态圈/Hadoop/Spark/Flink/数据仓库/实时分析/推荐系统
    课程实用性很强,老师讲的很透彻,都是面试容易问到的;紧扣当前企业所用技术,对于从事大数据或者转行大数据行业,都有很大的帮助。比屋教育,秉承“活学活用”的教育理念,集合资深专家讲师团队,依托完善的线上教学管控平台,专注于大数据、云计算、互联网架构师等领域的职业技能培训,着力培养......
  • 基于ssh酒店管理系统
    一、需求分析1.1、系统管理   用户管理:对该系统的使用者即用户信息进行维护。   日志管理:为了系统的安全,对前台人员的导致业务数据更新的操作需要记录日志系统管理员可以定期查看和删除日志。      酒店人员权限管理:可对酒店各部门的员工进行权限的统一分配,以及更新......
  • 基于安卓电影院订票系统
    随着社会经济的发展,计算机、智能手机的不断普及,人们的生活已和高科技息息相关。智能手机逐步融入、影响、改变着我们的生活。现代人手机购物越来越多,例如网上手机电影票的预定,人们生活水平的提高,精神消费越来越多,越来越多的人乐于去影院观看电影。因此,为了能使人们更方便快捷的购买......
  • 用 Qt 给嵌入式Linux加个桌面
    原文:https://www.linuxprobe.com/qt-add-desktop.html1.创建QML应用在QtCreator依次点击:->File->NewFileorProject->Applications->QtQuickApplication然后一路点击next直到finish。2.解析配置文件Linux 系统里安装过的应用,都会在/usr/share/applic......
  • 面向对象
    要想面向对象,操作对象,首先便要拥有对象;要创建对象,必须要先定义类,所谓的类可以理解为对象的模型;程序中可以根据类创建指定类型的对象;举例来说:可以通过Person类来创建人的对象,通过Dog类创建狗的对象,不同的类可以用来创建不同的对象;定义类class类名{属性名:类型;......