做服装设计兼职的网站湖南做旅游网站哪家最好
做服装设计兼职的网站,湖南做旅游网站哪家最好,wordpress淘客优惠券,网页界面设计以什么为载体目录
一.什么是Qt元对象系统#xff1f;
二.编译时Qt Creator偷摸做了哪些事情#xff1f;
1.uic
2.rcc
3.moc 一.什么是Qt元对象系统#xff1f;
Qt中的元对象系统#xff08;Meta-Object System#xff09;提供了对象间通信的信号和槽机制、运行时类型信息和动态属…目录
一.什么是Qt元对象系统
二.编译时Qt Creator偷摸做了哪些事情
1.uic
2.rcc
3.moc 一.什么是Qt元对象系统
Qt中的元对象系统Meta-Object System提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。元对象系统是基于以下3个条件的 ●该类必须继承自QObject类 ●必须在类的私有声明区声明Q_OBJECT宏在类定义时如果没有指定public或者private则默认为private) ●元对象编译器Meta-Object Compilermoc为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_castQWidget *(obj)
另外一个没有定义 Q_OBJECT 宏的类与它最接近的父类是同一类型的。也就是说如果 A 继承了 QObject 并且定义了 Q_OBJECTB 继承了 A 但没有定义 Q_OBJECTC 继承了 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.hMainWindow::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 QMainWindowQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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入门教程 6Qt元对象系统-CSDN博客
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88505.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!