首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【QT学习之路】-Qt入门

【QT学习之路】-Qt入门

作者头像
小陈又菜
发布2025-12-24 10:51:41
发布2025-12-24 10:51:41
1080
举报

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 的文件,这是项目的配置文件,记录了一些项目的配置信息,我们逐个看一下:

代码语言:javascript
复制
# 在项目文件中, 注释需要使用 井号(#)
# 项目编译的时候需要加载哪些底层模块
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函数中自动生成的这几行代码:

代码语言:javascript
复制
#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格式下编辑这个文件,所以不需要太多的关注:

代码语言:javascript
复制
<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个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)

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

代码语言:javascript
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>		// Qt标准窗口类头文件

QT_BEGIN_NAMESPACE
// mainwindow.ui 文件中也有一个类叫 MainWindow, 将这个类放到命名空间 Ui 中
namespace Ui { class MainWindow; }	
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT	// 这个宏是为了能够使用Qt中的信号槽机制

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;		// 定义指针指向窗口的 UI 对象
};

#endif // MAINWINDOW_H

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

窗口对应界面的源文件:

代码语言:javascript
复制
#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()列表中。当父对象析构时,子对象也会析构。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 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. 内存回收
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档