Qt项目文件解析与注意事项

1.项目文件解析

1.1 .pro文件

1.1.1 .pro文件解析

工程新建之后,在工程目录列表中有一个后缀为".pro"文件,".pro"文件就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件

该文件的核心内容如下:

cpp 复制代码
QT       += core gui           //包含的模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets   //大于Qt4版本才包含widget模块

CONFIG += c++11

before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp     //包含的源文件

HEADERS += \
    widget.h       //包含的头文件

FORMS += \
    widget.ui      //包含的界面文件

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

1.1.2 .pro文件写法

1.注释:从"#"开始,到这一行结束

2.QT+=core gui Qt包含的模块 Qt5包含的模块如下图所示

  1. greaterThan(QT_MAJOR_VERSION,4):QT+=widgets 这条语句的含义是,如果QT_MAJOR_VERSION大于4需要增加widgets模块。如果项目仅需支持Qt5,也可直接添加

"QT+=widgets"。不过为了保持代码兼容,最好还是按照QtCreator生成的语句编写

4.指定生成的应用程序名:TARGET = QtDemo

5.TEMPLATE=app//模版。告诉qmake为这个应用程序生成哪种makefile。下面是可供选择的模版:

app:建立一个应用程序的makefile,这是默认值,所以如果模版没有被指定,这个将被使用

lib:建立一个库的makefile

vcapp:建立一个应用程序的Visual Studio文件

vclib:建立一个库的Visual Studio项目文件

subdirs:这是一个特殊的模版,他可以建立一个能够进入特定目录的makefile并且为他调用make的makefile

6.工程中包含的源文件:SOURCES+=main.cpp/wdget.cpp

7.工程中包含的头文件:HEADERS+=widget.h

8.工程中包含的资源文件:RESOURCES+=painter.qrc

9.工程中包含的"ui"设计文件:FORMS+=widget.ui

10.配置信息:CONFG+=c++11(使用C++11特性)CONFIG用来告诉qmake关于应用程序的配置信息

1.2 widget.h文件

在Qt中,如果要使用信号与槽(signal和slot)的机制就必须加入Q_OBJECT宏;

Ui::Widget *ui;这个指针是用前面声明的namespace Ui里的Widget类定义的,所以指针ui是指向可视化设计的界面,后面要访问界面上的组件,都需要通过这个指针ui去访问。

1.3 main.cpp文件

使用Qt Create新建任意工程之后,main.cpp文件将包含以下代码

Qt系统提供的标准类名 声明的头文件没有.h后缀

QApplication为应用程序类;QApplication a;(a为应用程序对象,有且只有一个)

QApplication 管理图形化用户界面应用程序的控制流和主要设置

QApplication 是Qt的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其他资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理

对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0、1、2或更多个窗口

myWidget w;//实例化窗口对象

w.show();//调用show函数显示窗口

a.exec();//程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给Qt,Qt完成时间处理工作哦,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把他们传递给适当的窗口部件。

1.4 widget.cpp文件解析

widget.cpp文件是类Widget的实现代码,所有在窗体上要实现的功能添加在此文件中;

1.5 ui文件

widget.ui是窗体界面定义文件,是一个XML文件,定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。用UI设计器可视化设计的界面都由Qt自动解析,并且XML文件的形式保存下来。在设计界面时,只需要在UI设计器进行可视化设计即可,而不用管widget.ui文件是怎么生成的。

2.Qt编程中的注意事项

2.1 Qt中的命名规范

类名:首字母大写,单词和单词之间首字母大写;

函数名及变量名:首字母小写,单词和单词之间首字母大写;

2.2 Qt Creator中的快捷键

注释:ctrl+/

运行:ctrl+R

编译:ctrl+B

字体缩放:ctrl+滑轮

查找:ctrl+F

整体移动:ctrl+shift+方向上/方向下

帮助文档:F1

自动对齐:ctrl+i;

同名之间的.h和.cpp的切换:F4

生成函数声明的对应定义:alt+enter

2.3 对象模型(对象树)

在 Qt 中创建很多对象的时候会提供⼀个 Parent 对象指针,下⾯来解释这个 parent 到底是⼲什么的。

• QObject 是以对象树的形式组织起来的。

◦ 当创建⼀个 QObject 对象时,会看到 QObject 的构造函数接收⼀个 QObject 指针作为参数,这 个参数就是 parent,也就是⽗对象指针。

◦这相当于,在创建 QObject 对象时,可以提供⼀个其⽗对象,我们创建的这个 QObject 对象 会⾃动添加到其⽗对象的 children() 列表。

◦ 当⽗对象析构的时候,这个列表中的所有对象也会被析构。(注意,这⾥的⽗对象并不是继承 意义上的⽗类!)

这种机制在 GUI 程序设计中相当有⽤。例如,⼀个按钮有⼀个 QShortcut(快捷键)对象作为其 ⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。

• QWidget 是能够在屏幕上显⽰的⼀切组件的⽗类。

◦ QWidget 继承⾃ QObject ,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀ 个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如,当⽤⼾关闭 ⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该 ⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。

◦ 当然,我们也可以⾃⼰删除⼦对象,它们会⾃动从其⽗对象列表中删除。⽐如,当我们删除了 ⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕 显⽰。

Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。

• 当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树。不过,对象树中对象的 顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

• 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的 children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。Qt 保证没有 QObject 会被 delete 两次,这是由析构顺序决定的。 如果 QObject 在栈上创建,Qt 保持同样的⾏为。正常情况下,这也不会发⽣什么问题。来看下⾯的代码⽚段:

作为⽗组件的 window 和作为⼦组件的 quit 都是 QObject 的⼦类(事实上,它们都是QWidget的⼦ 类,⽽QWidget 是 QObject 的⼦类)。这段代码是正确的,quit 的析构函数不会被调⽤两次,因为标 准 C++ 要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作⽤域 时,会先调⽤ quit 的析构函数,将其从⽗对象 window 的⼦对象列表中删除,然后才会再调⽤ window 的析构函数。

但是,如果我们使⽤下⾯的代码:

情况⼜有所不同,析构顺序就有了问题。我们看到,在上⾯的代码中,作为⽗对象的 window 会⾸先 被析构,因为它是最后⼀个创建的对象。在析构过程中,它会调⽤⼦对象列表中每⼀个对象的析构函 数,也就是说, quit 此时就被析构了。然后,代码继续执⾏,在 window 析构之后,quit 也会被析 构,因为 quit 也是⼀个局部变量,在超出作⽤域的时候当然也需要析构。但是,这时候已经是第⼆次 调⽤ quit 的析构函数了,C++ 不允许调⽤两次析构函数,因此,程序崩溃了。 由此我们看到,Qt 的对象树机制虽然在⼀定程度上解决了内存问题,但是也引⼊了⼀些值得注意的事 情。这些细节在今后的开发过程中很可能时不时跳出来烦扰⼀下,所以,我们最好从开始就养成良好习惯

2.4 Qt中的坐标系

坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加

对于嵌套窗⼝,其坐标是相对于⽗窗⼝来说的。

相关推荐
cdut_suye10 分钟前
全面剖析 Linux 进程管理与 PCB 机制
java·linux·运维·服务器·c++·人工智能·python
仟濹14 分钟前
【算法 C/C++】二维前缀和
c语言·c++·算法
Chenyu_31019 分钟前
04.基于C++实现多线程TCP服务器与客户端通信
linux·服务器·网络·c++·tcp/ip·算法·visualstudio
音视频牛哥42 分钟前
C++20之2025年上桌我坐哪儿?
c++·编程语言·ai 编程
宇寒风暖44 分钟前
HTML嵌入CSS样式超详解(尊享)
前端·css·笔记·学习·html
mengzhi啊1 小时前
QTreeWidget的右键菜单,展开和折叠,或者其他操作
qt
不爱学习的小枫1 小时前
scala的集合
开发语言·scala
梦醒沉醉1 小时前
Scala的初步使用
开发语言·后端·scala
小白学大数据1 小时前
Fuel 爬虫:Scala 中的图片数据采集与分析
开发语言·爬虫·scala
十年编程老舅1 小时前
用Qt手搓AI助手,挑战24小时开发DeepSeek Assistant!
qt·计算机毕设·c++项目·qt项目·deepseek·计算机毕设项目