Qt 项目代码表明(4)

[复制链接]
发表于 2025-5-4 12:20:34 | 显示全部楼层 |阅读模式
简介:该篇文章主要先容的是当我们创建项目成功后,其自动创建的各文件代码的含义,这有助于理解其创建图形化界面的底层逻辑,为后续独立创建项目作铺垫。这些内容说紧张也紧张,说不紧张也不紧张,不过我以为可以尝试去理解理解,最后祝大家五一放假快乐~~
  初创建项目代码表明

   创建一个项目后,有五个文件需要逐一举行分析,弄懂它们的的大概意思
  

main.cpp

  1. #include "widget.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[]) // main的形参就是命令行参数
  4. {
  5.     QApplication a(argc, argv);
  6.     Widget w;
  7.     w.show();
  8.     return a.exec();
  9. }
复制代码

  • 如果要编写一个Qt的图形化界面步伐就肯定需要有QApplication对象(即 QApplication a(argc, argv) )
  • Widget w;这里Widget是创建项目时填写的类名(Class name),这一步就是去创建一个控件对象,而w.show就是让这个控件对象显示出来,w.hide()就是隐蔽这个控件对象
  • return a.exec();它则是让步伐实行起来
  • 还记得创建项目时有一个基类QWidget,它是Widget的父类,show 和 hide 方法则是由父类提供的
   这里要留意一下:之前在Linux中也学过六个函数(本质上是一个),叫做exec.历程步伐更换,把可实行文件中的代码和数据更换到当前历程中,而当前 Qt中的 exec和Linux中的exec没有任何关系,只是名字恰好是一样的。这样的设定挺常见的,计算机中经常会有一个术语,在差别的场所下,表示的含义不一样,这就需要团结上下文来举行理解。好比啥叫 栈,啥叫 堆,数据布局中的栈/堆,还是操纵体系,假造地址空间栈/堆,还是JVM 中的栈/堆,这几种完全是差别的
  widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class Widget; } // 类的声明
  6. QT_END_NAMESPACE
  7. class Widget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     Widget(QWidget *parent = nullptr);
  12.     ~Widget();
  13. private:
  14.     Ui::Widget *ui; // 和form file密切相关,这里不讨论
  15. };
  16. #endif // WIDGET_H
复制代码

  • #ifndef WIDGET_H & #define WIDGET_H,它们的作用是保证头文件只被包含一次,更保举这种写法:#pragma once
  • Q_OBJECT 它是一个Qt内置的宏,宏本质是文本更换,而它展开后就会天生一大堆代码,这是由于Qt中有一个非常核心的机制,即 “信号” 和 “槽”。如果某个类想去使用这个 “信号” 和 “槽” 就需要引入 Q_OBJECT这个宏
  • class Widget : public QWidget 这个QWidget就是我们创建项目时选择的父类,它是Qt SDK内置的,如果想要去使用这个类,就得包含对应的头文件 #include <QWidget> 。这里要补充一点,按照Qt的设定所使用Qt中内置的类,其类名和头文件的类名是划一的,固然也不是所有效到Qt的类都需要去显示包含头文件,在C++中头文件可能是 “间接包含” 的,好比你显示包含头文件 a.h,而头文件a.h中又包含b.h,那只引入a.h就已经包含头文件a.h 与 b.h,所以后续写代码时,可能不知道到底要包含多少个头文件,哪些头文件中又间接包含了什么头文件,那就先将这个Qt的类先拿过来用,如果这个类提示找不到界说,那就没有间接包含需要我们手动的显示把对应的头文件给包含一下即可
  • Widget(QWidget *parent = nullptr); 在Qt中引入了对象树的机制,此处的对象树就是一棵普通的N叉树(不是二叉树),其一个结点可能有N个孩子结点,但肯定只能有一个父结点。因此这段代码的意思就是,创建的这个对象可以把它挂到对象树上,挂的过程就是给它指定父结点的过程
widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent)
  4.     : QWidget(parent)
  5.     , ui(new Ui::Widget)
  6. {
  7.     ui->setupUi(this);
  8. }
  9. Widget::~Widget()
  10. {
  11.     delete ui;
  12. }
复制代码

  • #include "ui_widget.h",form file被qmake天生的头文件
  • ui->setupUi(this);将form file天生的图形化界面和当前的widget关联起来,关键点在于这个 form file文件
widget.ui(关键点)

   双击widget.ui文件,此时Qt Creator就会去调用Qt Designer打开ui文件,出现图形化的界面编辑器
  

   此时再点左侧边栏的编辑按钮,就会显示 .ui的本体内容了
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>Widget</class>
  4. <widget class="QWidget" name="Widget">
  5.   <property name="geometry">
  6.    <rect>
  7.     <x>0</x>
  8.     <y>0</y>
  9.     <width>1255</width>
  10.     <height>600</height>
  11.    </rect>
  12.   </property>
  13.   <property name="windowTitle">
  14.    <string>Widget</string>
  15.   </property>
  16. </widget>
  17. <resources/>
  18. <connections/>
  19. </ui>
复制代码

  • 起首这个格式被称为 xml格式,它既有成对的标签(<ui...> ... </ui>),也有单标签( <resources/>)等等
  • 这里的 xml格式 与 html格式非常的类似,都是使用成对的标签来表示数据,xml这里的标签,有哪些标签,都表示什么含义,都是步伐员本身去人为界说的,而我们此处看到的这些标签都是开发Qt的大佬们本身决定的,那这里标签它们的具体含义我们无需关注,只需要知道 widget.ui文件本质上是一个xml即可,而html固然也是通过标签来表示,但html的标签都是固定的,每个标签是啥含义,都有一个专门的标准委员会约定的,每个浏览器都是按照同样的规则去表明
  • Qt中使用的xml文件就是去描述步伐的界面是啥样的,进一步qmake就会调用相关的工具,依据这个xml文件天生一些C++代码,从而把完整的界面构造出来
  •        以下是任意找的网页源代码

Qt_design_2.pro

   .pro后缀 是Qt项目标工程文件,也是qmake工具构建的紧张依据
  1. QT       += core gui
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. CONFIG += c++11
  4. # The following define makes your compiler emit warnings if you use
  5. # any Qt feature that has been marked deprecated (the exact warnings
  6. # depend on your compiler). Please consult the documentation of the
  7. # deprecated API in order to know how to port your code away from it.
  8. DEFINES += QT_DEPRECATED_WARNINGS
  9. # You can also make your code fail to compile if it uses deprecated APIs.
  10. # In order to do so, uncomment the following line.
  11. # You can also select to disable deprecated APIs only up to a certain version of Qt.
  12. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
  13. SOURCES += \
  14.     main.cpp \
  15.     widget.cpp
  16. HEADERS += \
  17.     widget.h
  18. FORMS += \
  19.     widget.ui
  20. # Default rules for deployment.
  21. qnx: target.path = /tmp/$${TARGET}/bin
  22. else: unix:!android: target.path = /opt/$${TARGET}/bin
  23. !isEmpty(target.path): INSTALLS += target
复制代码

  • QT += core gui 要引入的Qt模块,背面学习到一些内容时可能会修改这里
  • 下面的代码片断描述了当前项目中参与构建的文件都有哪些,即编译器需要去编译哪些文件,这个地方无需我们手动修改,Qt Creator会帮我们自动维护好
  1. SOURCES += \
  2.     main.cpp \
  3.     widget.cpp
  4. HEADERS += \
  5.     widget.h
  6. FORMS += \
  7.     widget.ui
复制代码

  • .pro类似于Linux中的 Makefile文件(自动化编译),qmake搭配 .pro 起到的作用就和 Makefile 是类似的。只不过Qt Creator把这个过程中编译的细节都已经封装好,无需过多关注,只需要我们直接点击运行按钮就能直接编译运行
天生的额外文件

   上面天生的 .h,.cpp,.ui,.pro文件都是源代码,如果编译运行Qt项目,构建过程中还会天生一些中心文件。鼠标放到左边栏框中的任意一个文件,右键点 在Explorer(文件管理器)中显示,再退回到上一步路径会发现多出来一个 “build-xxxx" 目次,那这个目次内里就是该项目运行过程中,天生的一些临时文件
  

   双击点进去后会看到如下内容,由此看到这个编译Qt步伐也会用到Makefile,只不过这个 Makefile 无需手动写,而是qmake帮我们自动天生的。而这个 ui_widget.h它是由 xml天生的.h文件,也是在widget.cpp中所包含的头文件
  

   当点进debug目次会看到有个可实行步伐(exe),而这个步伐就是最终天生的可实行步伐,如果直接运行效果就跟之前在 Qt Creator中运行出来的窗口相同
  

   下面是 Ui_Widget.h头文件的主体代码,你将文件widget.h与widget.cpp团结起来看,widget.h 与 widget.cpp 声明和界说分离,其子类Widget的构造函数在完成初始化的同时会去调用父类的setupUi函数去天生界面的具体细节
  1. // widget.cpp
  2. Widget::Widget(QWidget *parent)
  3.     : QWidget(parent)
  4.     , ui(new Ui::Widget)
  5. {
  6.     ui->setupUi(this);
  7. }
复制代码
  1. // Ui_Widget.h
  2. class Ui_Widget
  3. {
  4. public:
  5.     void setupUi(QWidget *Widget)
  6.     {
  7.         if (Widget->objectName().isEmpty())
  8.             Widget->setObjectName(QString::fromUtf8("Widget"));
  9.         Widget->resize(1255, 600);
  10.         retranslateUi(Widget);
  11.         QMetaObject::connectSlotsByName(Widget);
  12.     } // setupUi
  13.     void retranslateUi(QWidget *Widget)
  14.     {
  15.         Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
  16.     } // retranslateUi
  17. };
  18. namespace Ui {
  19.     class Widget: public Ui_Widget {};
  20. } // namespace Ui
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表