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

【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.xdnf.cn/news/18759.html

相关文章:

  • 解决Windows更新后WPF程序报TypeLoadException异常的问题
  • Node.js(3)—— fs模块
  • 3D游戏角色建模资源搜索指南(资料来源于网络)
  • 恒坤新材科创板IPO上市关注,致力推动集成电路材料国产化
  • 领克08 EM-P新款官图发布,外观微调并增激光雷达
  • CentOS 7 服务器初始化完整流程
  • WhisperLiveKit:实时语音转文本
  • Vue3核心概念之构造函数和普通函数
  • Dify智能体平台二次开发笔记(10):企业微信5.0 智能机器人对接 Dify 智能体
  • LeetCode - 20. 有效的括号
  • 深入浅出理解支持向量机:从原理到应用,解锁分类算法的核心密码
  • 【golang长途旅行第32站】反射
  • 【大前端】React统计所有网络请求的成功率、失败率以及统一入口处理失败页面
  • 基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android
  • CVPR论文速递 | DL3DV-10K:10K+真实场景,打破三维视觉数据荒!
  • (论文速读)Prompt Depth Anything:让深度估计进入“提示时代“
  • 抽签占卜抖音快手微信小程序看广告流量主开源
  • 基于SpringBoot的演唱会网上订票系统的设计与实现(代码+数据库+LW)
  • 深入浅出理解支持向量机(SVM):从原理到实践
  • 《鸿蒙开发 3 天速成:核心知识点 + 实战案例精讲》
  • Uniapp(Vue2)Api请求封装
  • 解决VSCode无法下载服务器端 Server问的题
  • vue3 + jsx 中使用native ui 组件插槽
  • 使用 mcp-use 构建极简 Web 自动化测试智能体「喂饭教程」
  • http与https配置
  • 管理网络安全
  • FreeRTOS学习笔记(四):任务执行与切换
  • 入门Ubuntu操作系统
  • 类型签名,位置参数,关键字参数
  • 【Jetson】基于llama.cpp部署gpt-oss-20b(推理与GUI交互)