Qt6入门教程 6:Qt元对象系统

本文介绍了Qt中的元对象系统,包括其在信号槽机制中的核心作用,以及编译时QtCreator如何通过uic、rcc和moc工具处理用户界面、资源和元对象编译。
摘要由CSDN通过智能技术生成

目录

一.什么是Qt元对象系统?

二.编译时Qt Creator偷摸做了哪些事情?

1.uic

2.rcc

3.moc


一.什么是Qt元对象系统?

Qt中的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。元对象系统是基于以下3个条件的:
●该类必须继承自QObject类;
●必须在类的私有声明区声明Q_OBJECT宏(在类定义时,如果没有指定public或者private,则默认为private);
●元对象编译器Meta-Object Compiler(moc),为QObject的子类实现元对象特性提供必要的代码。
其中,moc工具读取一个C++源文件,如果它发现一个或者多个类的声明中包含有Q_OBJECT宏,便会另外创建一个C++源文件(就是在项目目录中的debug或release目录下看到的以moc开头的C++源文件),其中包含了为每一个类生成的元对象代码。 这些创建的源文件或者被包含进类的源文件中,或者和类的实现同时进行编译和链接。
元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制以外,元对象系统还提供了其他一些特性:
●QObjeCt::metaObject()函数可以返回一个类的元对象,它是QMetaObject类型的对象;
●QMetaObject::className()可以在运行时以字符串形式返回类名,而不需要C++编辑器原生的运行时类型信息(RTTI)的支持;
●QObject::inherits()函数返回一个对象是否是QObject继承树上一个类的实例的信息;
●QObject: :tr()和QObject: :trUtf8()迸行字符串翻译来实现国际化;
●QObject::setProperty()和QObject::property()通过名字来动态设置或者获取对象属性;
●QMetaObject::newlnstance()构造该类的一个新实例。
除了这些特性,还可以使用qobject_cast()函数来对QObject类进行动态类型转换,这个函数的功能类似于标准C++中的dynamic_cast()函数,但它不再需要RTTI的支持。这个函数尝试将它的参数转换为尖括号中的类型的指针,如果是正确的类型,则返回一个非零的指针,如果类型不兼容则返回0。
例如:

QObject *obj = new MyWidget;
QWidget *widget = qobject_cast<QWidget *>(obj);

另外,一个没有定义 Q_OBJECT 宏的类与它最接近的父类是同一类型的。也就是说,如果 A 继承了 QObject 并且定义了 Q_OBJECT,B 继承了 A 但没有定义 Q_OBJECT,C 继承了 B,则 C 的 QMetaObject::className() 函数将返回 A,而不是本身的名字。因此,为了避免这一问题,所有继承了 QObject 的类都应该定义 Q_OBJECT 宏,不管你是不是使用信号槽。
关于元对象系统,详见:Qt Assistant—>The Meta Object System关键字。
信号和槽机制是Qt的核心内容,它依赖于元对象系统,将在下一篇中介绍。

二.编译时Qt Creator偷摸做了哪些事情?

结合前面几篇博文,我们看看编译时Qt Creator偷摸做了哪些事情:

1.uic

User Interface Compiler,它读取Qt Designer创建的XML格式的user interface definition(.ui)文件,生成对应的C++头文件(以ui_为前缀)
.ui文件存在的意义是让界面和业务分离,这样UI设计工程师可以用Qt Designer专心的设计界面,而不用关系业务逻辑。那么.ui文件最后是如何根 C++业务代码关联起来的呢?ui_xxxx.cpp文件中的setupUi函数便是桥梁。
以前面HelloWorld项目中的MainWindow类为例:

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   // 添加标题栏图标
    setWindowIcon(QIcon(":/icons/AppIcon.ico"));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

在构造函数中我们调用了ui对象的setupUi方法,并传入MainWindow类的指针;在析构函数中将ui对象删除。
切换到mainwinows.h

#include <QMainWindow>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
  Q_OBJECT
 
public:
  MainWindow(QWidget *parent = nullptr);
  ~MainWindow();
 
private:
  Ui::MainWindow *ui;
};

namespace Ui { class MainWindow; }是前缀声明,这样就可以用Ui::MainWindow声明指针变量ui:

Ui::MainWindow *ui;

而Ui { class MainWindow; }中的MainWindow正是ui_mainwindow.h中Ui_MainWindow类的子类,因此在调用setupUi后,就能用ui访问界面的控件了。

#ifndef UI_MAINWINDOW_H  
#define UI_MAINWINDOW_H  
 
QT_BEGIN_NAMESPACE 
class Ui_MainWindow  
{  
public:  
    // 一些控件对象的声明
    ......
    void setupUi(QMainWindow *MainWindow)  
    {  
         // 一些控件对象的定义
         ......
    } // setupUi  
    ......
};  
 
namespace Ui {  
     class MainWindow: public Ui_MainWindow {};  
} // namespace Ui  
 
QT_END_NAMESPACE  
#endif // UI_MAINWINDOW_H 

2.rcc

Resource Compiler,用于在编译时将资源嵌入到Qt程序中,它读取XML格式的Qt resource(.qrc)文件,生成一个包含资源数据的C++源文件(以qrc_为前缀)

3.moc

Meta-Object Compiler,用于读取一个C++源文件,如果它发现一个或者多个类的声明中包含有Q_OBJECT宏,便会另外创建一个C++源文件(以moc_为前缀)
uic.exe、rcc.exe和moc.exe都在Qt的安装目录中,自己找找吧!

原文链接:Qt6入门教程 6:Qt元对象系统-CSDN博客

  • 64
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
### 回答1: Qt5是一款跨平台的应用程序框架,适用于Windows、Linux、macOS和Android等多种操作系统。提供了诸如GUI、网络、数据库、XML、音频、视频等多个领域的丰富功能,因此成为开发人员常用的工具之一。 如何学习Qt5呢?首先,需要掌握C++编程语言,对于没有基础的人来说,需要先学习C++基础语法。其次,需要安装并配置好Qt5开发环境,包括Qt Creator IDE和Qt Framework等。安装完成后,就可以开始进行Qt5的编程学习了。 Qt5入门教程主要内容包括:Qt5的基本概念和常用组件, Qt对象模型和信号槽机制,界面设计和布局,窗口管理和事件处理等方面。在实践中,可以通过编写一些小型的应用程序来巩固所学内容。例如实现一个简单的文本编辑器、图像浏览器,模拟一个简单的计算器等。 在学习过程中,需要注意一些常见的问题。例如,Qt对象的生命周期、信号槽的连接方式、事件处理的优先级等都需要注意。另外,Qt5的文档和示例非常丰富,开发者可以通过查阅官方文档和代码示例来更好地理解Qt5的使用方法和特点。 总之,Qt5是一款功能强大的开发框架,适合从事图形界面开发、嵌入式开发、游戏开发等多个领域。学习Qt5需要掌握C++编程语言、熟悉Qt5的各种组件和特性,并进行实践。通过不断的学习和实践,开发者可以在Qt5框架下开发出高质量的应用程序。 ### 回答2: Qt是一种跨平台的C++应用程序开发框架。Qt5提供了许多新的特性和改进,如QML、Qt Quick、Qt Quick Controls和Qt WebEngine等。对于新手,Qt5入门教程非常重要,因为它可以帮助他们快速上手并深入了解框架。 Qt5入门教程详细讲解版应该包括以下内容: 1.安装和设置Qt5:介绍不同平台上的安装步骤和必需的设置。 2.基本概念:介绍概念,如信号和槽、对象型、元对象系统Qt应用程序的生命周期等。 3.第一个Qt5应用程序:创建一个Hello World应用程序并解释基本的代码架构。介绍Qt Creator集成开发环境的使用步骤。 4.Qt5界面设计:介绍QML、Qt Quick和Qt Quick Controls,这些特性可用于创建现代和响应式的应用程序界面。 5.数据持久性:介绍如何使用Qt5框架中的SQLite、MySQL和PostgreSQL等来实现数据持久性。 6.QWidget和QMainWindow:将介绍如何使用QWidget和QMainWindow类来创建桌面应用程序界面,添加菜单和栏,应用程序状态栏和工具栏。 7.调试和部署:说明如何调试和部署Qt应用程序。 总之,Qt5入门教程详细讲解版旨在帮助新手更好地了解Qt5框架并开始创建跨平台的应用程序。 ### 回答3: Qt5是一款流行的开源跨平台应用程序开发框架,用于构建桌面,移动和嵌入式应用程序。它支持多种编程语言,例如C ++,Python和JavaScript。本教程将详细讲解如何使用Qt5开始开发应用程序。 Qt5入门教程以C++语言为基础进行讲解,首先阐述了Qt5的工作原理和基本架构。之后,教程介绍了如何建立一个Qt5应用程序开发环境,并详细阐述了Qt Creator的功能和用法。接着,通过一个简单的“Hello World”应用程序示例,该教程介绍了Qt5的界面设计和常用控件的使用方式。 在基础知识介绍之后,本教程深入探讨了Qt5的核心构件,例如Qt Widgets,Qt Quick和Qt WebEngine。通过这些构件的讲解,学习者将会掌握如何在Qt5中创建各种用户界面。 本教程还包括有关处理Qt5信号和槽机制、自定义控件以及在Qt5应用程序中使用外部库的介绍。此外,教程详细讲解了如何调试和部署Qt5应用程序,并介绍了Qt5的一些高级功能,例如Qt Multimedia和Qt OpenGL。 总的来说,本教程非常详细,包含丰富的示例和练习,可以帮助初学者快速上手使用Qt5来开发各种类型的应用程序。无论您是想学习Qt5的初学者,还是有经验的开发人员,该教程都不容错过。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

草上爬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值