当前位置: 首页 > news >正文

【QT学习之路】-Qt入门


目录

1. Qt "Hello,World!"

2. 文件说明

2.1. 项目配置文件(.pro)

2.2. 项目源文件(main.cpp)

2.3. 项目窗口界面文件(mainwindow.ui)

2.4. 窗口界面头文件(mainwindow.h)

2.5. 窗口界面源文件(mianwindow.cpp)

3. Qt中的窗口类

3.1. 基础窗口类

3.2. 窗口的显示

4. 坐标体系

4.1. 坐标原点

4.2. 窗口的相对坐标

6. 内存回收


1. Qt "Hello,World!"

在大家安装完了QtCreator后我们来创建我们的第一个Qt项目(Qt的安装视频我看后期能不能出一个)。

进入QtCreator界面后,我们可以看见左边的文件选项,和右边的new选项,这两个按键都可以为我们创建一个Qt项目文件:

这里我们选择点击new:

然后我们来创建HelloWorldQt:

注意:Qt中的项目路径不要有中文!!!

然后我们接着进入项目的一些基本信息的配置:

然后下面这个界面可能Qt有的版本会有,有的没有(没有的忽略即可)。这实际上就是使用Qt Linguist为你的Qt项目提供一个不同语言的翻译版本(不选择对于项目本身没有影响):

继续地话,我们可以来到了编译套件的选择,如果有多个套件的话选择一种即可,我这里就只有一个DeskTop Qt的编译套件,所以上面的SelectAll会自动勾上:

然后还有版本控制工具的选择:

最后我们点击完成,就创建好了我们的第一个项目,项目的文件结构就长下面这样:

2. 文件说明

接下来我们我们看一看这个文件结构当中的一些文件分别是什么。

2.1. 项目配置文件(.pro)

在创建Qt项目之后会自动生成一个后缀为 .pro 的文件,这是项目的配置文件,记录了一些项目的配置信息,我们逐个看一下:

# 在项目文件中, 注释需要使用 井号(#)
# 项目编译的时候需要加载哪些底层模块
QT       += core gui # 如果当前Qt版本大于4, 会添加一个额外的模块: widgets
# Qt 5中对gui模块进行了拆分, 将 widgets 独立出来了
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets# 使用c++11新特性
CONFIG += c++11	#如果在项目中调用了废弃的函数, 项目编译的时候会有警告的提示    
DEFINES += QT_DEPRECATED_WARNINGS# 项目中的源文件
SOURCES += \main.cpp \mainwindow.cpp# 项目中的头文件
HEADERS += \mainwindow.h# 项目中的窗口界面文件
FORMS += \mainwindow.ui# 项目的(安装)部署规则
#在 QNX 上,安装到 /tmp/ 目录(临时测试)。
#在 Linux/macOS 上,安装到 /opt/ 目录(标准第三方软件目录)。
#对于 Windows 或 Android,这段代码没有定义任何规则,所以 target.path 为空,make install 可能#不会有任何效果,除非你在别处定义了规则。
#!!!如果你的Qt是在windows上的,可能没有这一段代码,没有影响qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.2. 项目源文件(main.cpp)

这个源文件中有程序的入口函数,我们来看一下main函数中自动生成的这几行代码:

#include "mainwindow.h"		// 生成的窗口类头文件
#include <QApplication>		// 应用程序类头文件int main(int argc, char *argv[])
{// 创建应用程序对象, 在一个Qt项目中实例对象有且仅有一个// 类的作用: 检测触发的事件, 进行事件循环并处理QApplication a(argc, argv);// 创建窗口类对象MainWindow w;// 显示窗口w.show();// 应用程序对象开始事件循环, 保证应用程序不退出return a.exec();
}

2.3. 项目窗口界面文件(mainwindow.ui)

在Qt中每一个窗口有对应一个可编辑的可视化界面(.ui),这个文件实际上是一个XML格式文件,一般情况下我们不需要在XML格式下编辑这个文件,所以不需要太多的关注:

<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个XML格式的文件 -->
<!-- 看不懂这种格式没关系, 我们不需要在这种模式下操作这个文件。 -->
<!-- 这里只是给大家介绍这个文件的本质 -->
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"/><widget class="QMenuBar" name="menubar"/><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

2.4. 窗口界面头文件(mainwindow.h)

是窗口界面对应类的头文件(换句话说,窗口对应类的定义放在这里):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>		// Qt标准窗口类头文件QT_BEGIN_NAMESPACE
// mainwindow.ui 文件中也有一个类叫 MainWindow, 将这个类放到命名空间 Ui 中
namespace Ui { class MainWindow; }	
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT	// 这个宏是为了能够使用Qt中的信号槽机制public:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;		// 定义指针指向窗口的 UI 对象
};#endif // MAINWINDOW_H

2.5. 窗口界面源文件(mianwindow.cpp)

窗口对应界面的源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)	// 基于mainwindow.ui创建一个实例对象
{// 将 mainwindow.ui 的实例对象和 当前类的对象进行关联// 这样同名的连个类对象就产生了关联, 合二为一了ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}

3. Qt中的窗口类

3.1. 基础窗口类

我们在一开始创建窗口类的时候有三个选项可以选择:QMainWindow、QDialog、QWidget如下图:

QWidget:

  • 所有窗口类的基类
  • Qt中的控件(输入框、按钮、单选框)也属于窗口,基类都是QWidget
  • 可以内嵌到其他其他窗口(没有边框)
  • 同样也可以不进行内嵌,但是使用(有边框)

QDialog:

  • 对话框类,后面会具体介绍这个窗口
  • 不能内嵌=到其他窗口

QMainwindow:

  • 这个窗口具有菜单栏、状态栏、工具栏
  • 同样不能内嵌到其他窗口

3.2. 窗口的显示

内嵌窗口:

  • 依附于一个大的窗口
  • 这个大的窗口是内嵌窗口的父窗口
  • 父窗口显示,内嵌的窗口也就会被显示

不内嵌窗口:

  • 有边框,标题栏
  • 必须要调用函数才能显示

4. 坐标体系

在Qt中窗口的显示是需要指定位置的,这个位置是基于坐标的,而坐标的选取是基于坐标原点的。

4.1. 坐标原点

坐标原点位于窗口的左上角:

  • x轴向右递增
  • y轴向下递增

4.2. 窗口的相对坐标

Qt中的窗口都需要坐标,有许多窗口是内嵌到其他窗口的,子窗口的坐标是基于父窗口的:

  • 子窗口的坐标选取始终是以父窗口的左上角为基准的(是相对的关系)

下面举一个例子进行解释:

假设我们有一个父窗口 Parent 和一个放在它里面的子窗口 Child

  • 父窗口 Parent:

    • 整体大小(包括边框):frameGeometry() -> QRect(100, 100, 400, 300) (在屏幕坐标 (100,100) 处,宽400,高300)

    • 内容区域大小:geometry() -> QRect(110, 130, 380, 260) (因为边框和标题栏占掉了一些空间)

  • 子窗口 Child:

    • 我们在父窗口的内容区域内放置它。

    • 设置其位置:Child->move(50, 30);

    • 设置其大小:Child->resize(100, 80);

现在,我们来解释坐标:

  1. Child->pos()

    • 返回值是 QPoint(50, 30)

    • 这意味着子窗口 Child 的左上角,位于父窗口 Parent内容区域左上角向右 50像素,向下 30像素 的地方。

    • 这个坐标与屏幕绝对坐标、与父窗口的边框都无关,只与父窗口的内容区域左上角有关。

  2. Child->geometry()

    • 返回值是 QRect(50, 30, 100, 80)

    • 这个矩形的左上角 (50, 30) 就是 pos(),大小 (100, 80) 就是子窗口的大小。

6. 内存回收

Qt在创建对象的时候会创建一个Parent对象指针(可以查看类的构造函数),那么Parent到底是用来干嘛的:

QObject是以对象树形式组织的。每当创建一个QObject对象的时候,构造函数会接收一个QObject指针,这个参数其实就是Parent,也就是父对象指针。更简单地说,没创建一个QoObject对象,就会提供一个它父对象,同时会将这个创建的对象加入到父对象的children()列表中。当父对象析构时,子对象也会析构。

http://www.dtcms.com/a/351758.html

相关文章:

  • 新型隐蔽恶意软件利用TP-Link、思科等路由器漏洞获取远程控制权
  • ZMC900E如何实现多主站协同控制?
  • 【typenum】 29 类型级别的数字数组标记特质(TypeArray)
  • 基于政策传导因子与就业脆弱性指数的鲍威尔9月降息决策分析
  • Prometheus 告警组件 Alertmanager 的使用并接入 Grafana
  • docker 安装nacos(vL2.5.0)
  • Android之讯飞语音合成和语音识别
  • React 代码规范
  • 算法练习-合并两个有序数组
  • 表格比对的实现
  • 如何确定哪些层应添加适配器(Adapter)?(58)
  • 餐中服务:藏在菜香里的 “情感传递术”
  • Java继承与虚方法详解
  • 掌握常用CSS样式:从基础到实战的全面指南
  • 从0开始学习Java+AI知识点总结-26.web实战(Springboot原理)
  • 产品经理成长手册(2)——产品文档能力
  • 14、RocketMQ生产环境如何优化
  • Linux查看服务器内存、磁盘、cpu、网络占用、端口占用情况
  • THM El Bandito
  • 设计模式学习笔记-----抽象责任链模式
  • 常见的设计模式
  • 深度学习篇---1*1卷积核的升维/降维
  • Unity笔记(七)——四元数、延迟函数、协同程序
  • 【Linux】Keepalived + Nginx高可用方案
  • [pilot智驾系统] 驾驶员监控守护进程(dmonitoringd)
  • 从代码学习深度强化学习 - 多智能体强化学习 IPPO PyTorch版
  • pytorch_grad_cam 库学习笔记——基类ActivationsAndGradient
  • vue2 和 vue3 生命周期的区别
  • 【Android】不同系统API版本_如何进行兼容性配置
  • 2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析