> 技术文档 > Qt + C++ 入门_qt c++

Qt + C++ 入门_qt c++


0.开章须知

  1. 本文档所有的资源均来源于互联网上大伙的无私奉献,尤其感谢:

Qt开发经验:自己总结的这十多年来做Qt开发以来的经验,以及Qt相关武林秘籍电子书,会一直持续更新增加,欢迎各位留言增加内容或者提出建议,谢谢!公众号:Qt实战/Qt入门和进阶/Qt教程


1.什么是qt

1.1 Qt基础概念普及

       Qt是一个跨平台的C++图形用户界面应用程序框架(是框架!!!)

        它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展。Qt为开发者提供了一种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应用程序,同时也可以使用C++语言进行高级开发。

       前面说了qt是程序框架,所以还需要使用开发工具进行框架的搭建。

        目前常用在qt的开发工具有QtCreator、VisualStudio、Eclipse。前者是官网推荐的开发工具,后者通过添加Qt组件也能够实现Qt的开发。

       QtCreator是一个轻量级的跨平台集成开发环境(IDE),专为使用Qt框架进行应用程序开发而设计(一般在网络上搜索的qt就是直接先安装QtCreator,然后在添加qt组件)。

       简单来说:QtCreator是一个功能齐全、易于使用且高效的跨平台IDE,适用于各种类型的应用程序开发,特别是那些使用Qt框架的开发者。

        优点是面向开发者,有利于开发者开发,开发速度块;缺点是没有考虑到图像本身的美观性能,采用QtCreator做出的上位机界面一般并不美观。庆幸的是QtCreator能够使用多种编程语⾔来弥补这一遗憾(如QML、JavaScript),可惜的是本人不研究Web那套内容,有需要的小伙伴自己找两本书看看。后面可能会因为用别人的Qml样式来实现更加精美的页面布局。不过那也是后面再说的事情了。

Qt 6之一:简介、安装与简单使用_qt6-CSDN博客

目前支持qt开发的系统有很多:

典型的成功案例就是windows的office

下载安装还有一些配置参考:

  • 【保姆级图文教程】QT下载、安装、入门、配置VSQt环境-CSDN博客
  • 【保姆级图文教程】最新Windows系统QT下载、安装、入门、配置VS Qt环境,图文详细、内容充实-CSDN博客

上面最后安装的时候有一个快速镜像网站的网址方便下载

由于qt5.15版本以后(包括5.15)不在提供离线安装包,所以在一些涉密的电脑建议就用5.14.2版本(最后一个离线安装的版本)

参考离线安装教程:window下QT的安装(包括离线安装5.14和在线安装qt6)_qt离线安装-CSDN博客

1.2 qt开发工具简介

早期使用的系统是Unix系统,比较有名的就是GCC套件(GNUCompilerCollection,GNU编译器套件)为了在Windows系统里可以使用GNU工具,诞生了MinGW(MinimalistGNUforWindows)利用MinGW就可以生成Windows里面的exe程序和dll链接库。当然毕竟是在windows下使用得到MinGW与Linux/Unix系统里GNU工具集的有些区别(当然差异性还是很大的)。MinGW原本是用于生成32位程序的,随着64位系统流行起来,从MinGW分离出来了MinGW-w64项目,该项目同时支持生成64位和32位程序。Qt的MinGW版本库就是使用MinGW-w64项目里面的工具集生成的。

类似C++需要借助Cmake实现复杂项目得到构建,Qt则使用了qmake工具生成makefile文件,没有用CMake。

1.3 QtCreator的安装

      

需要注意安装得到Qt版本中如果不需要使用相关的插件就可以不安装相关的插件(例如桌面开发就需要用到Android)

Qt需要注意一点,为了让其他软件能够找到Qt安装的路径,还需要配置环境变量,高版本可能不知需要配置

参考:Qt 安装与环境变量的设置(Windows 10)_qt环境变量-CSDN博客

1.4 qmake、cmake编译方式说明

【Qmake、CMake和Qbs说明:它们自动生成的构建系统的配置文件,都是文本文件

Qmake的是.pro文件(应用程序名称.pro)

CMake的是CMakeLists.txt文件

Qbs的是.qbs文件(应用程序名称.qbs)

Qmake、CMake和Qbs都是跨平台的构建系统,它们都可以用于构建C++项目,但是它们在语法和使用方式上存在一些不同。

Qmake:

Qmake是Qt开发框架自带的构建工具,被广泛应用于Qt项目的构建。Qmake采用类似于make的语法,可以通过.pro文件来描述项目的结构和编译规则,简单易学,适合小型项目。Qmake支持跨平台构建,可以生成VisualStudio、Xcode和makefile等多种构建系统所需的文件。在QtCreator10.0.1版本中,已经移除QMake。【早期版本一般练习选用这个】

CMake:

CMake是一款独立的构建工具,不依赖于任何特定的开发框架。CMake使用CMakeLists.txt文件来描述项目的结构和编译规则,支持跨平台构建,并且可以生成VisualStudio、Xcode、makefile以及Ninja等多种构建系统的文件。CMake相比Qmake更加灵活,可以支持更复杂的项目结构。

Qbs:

Qbs是Qt公司推出的全新构建系统,使用QML的声明式语言来描述项目和构建规则,支持跨平台构建,相比于Qmake和CMake,Qbs比较适合于大型、复杂的项目支持自动化依赖解决,减少了构建系统配置的工作量。】

学习的时候学习qmake,但是后面的工程需要用到cmake进行管理,单击“Next”按钮

简单说一下qt开头会默认选择一些东西,在上面会默认悬着三种界面模式,这三个窗口的作用:

1.Generateform复选框

勾选QtCreator会自动创建窗口UI文件(.ui文件)。默认勾选。在此按默认勾选

不勾选,这样创建的项目里就没有窗口UI文件(.ui文件)。

2.基类(Bsseclass):QMainWindow、QWidget和QDialog

QMainWindow:用于创建主窗口应用程序。它提供了菜单栏、工具栏、状态栏等顶层组件,并且可以包含其他QWidget子类。在QMainWindow的初始用户界面中,菜单并不是默认显示的,如果你想要添加菜单到QMainWindow中,需要手动创建和设置。

QWidget:是所有Qt用户界面对象的基类,它本身不具有绘制任何内容的功能,但可以作为容器来包含其他控件。

QDialog:是一个对话框窗口,主要用于与用户进行交互(例如获取输入或显示消息),并且通常会返回一些数据给调用者。

这三个类都是Qt中常用的基类,每个类都有其特定的用途和优点,具体使用哪个类取决于应用程序的需求和设计。

如果需要创建大型桌面应用程序,可以选择使用QMainWindow作为基类;如果只需要创建一个独立的小部件,可以使用QWidget作为基类;如果需要打开模态对话框或自定义对话框,可以使用QDialog作为基类。

我这里选QWidget,单击“Next”按钮:

一般选用QWidget,Generateform如果勾选了能够直接拖拽一些现有的图形界面,自动生成相关的代码。

TranslationFile(翻译文件)界面,如果您计划通过QtLinguist工具为您的项目用户界面提供翻译,请在这里选择一种语言。将为您生成相应的翻译(.ts)文件。

不改变默认的,单击“Next”按钮

1.5 编译运行

默认是MinGW编译器来生成Debug、release文件因为有其他项目的需求所以我有的时候会使用msvc 2019及vs 2019这个版本生成可执行文件。

编译和运行

在QtCreator中,\"buildproject\"和\"run\":

\"Buildproject\"【BuildProject“项目名”Ctrl+B】用于编译并构建项目,生成可执行文件。当您修改了项目文件或源代码之后,需要重新执行\"Buildproject\"操作来更新可执行文件。如果有编译错误,则需要在\"CompileOutput\"视图中查看错误信息并进行修复。

\"Run\"【RunCtrl+B】操作用于运行已经构建好的可执行文件。

在执行\"Run\"操作之前,必须先执行\"Buildproject\"以生成可执行文件。如果对源代码进行了更改,也需要重新执行\"Buildproject\"操作以更新可执行文件。

当修改了某些非源代码文件(如资源文件或UI文件)时,这些文件可能会自动重新构建,因此可以直接使用\"run\"操作来启动应用程序,而不需要重新执行\"buildproject\"操作。

可以使用“Build→BuildProject”菜单命令进行编译:

默认初始代码是这样的:值得注意的是Qt的这种框架是main函数不需要写死循环,默认界面是阻塞的(即内部自自己定义了一套用于显示界面且不需要死循环的逻辑,我们只要用它的这种main函数的框架就可以了)。

构建编译(ctrl+b)结束后,还需要点击运行(ctrl+r)

之后会弹出窗口

注意:qt的安装以及项目文件位置以及命名不能含有中文

每次打开项目的时候应该找到项目路径下的pro文件,这样才能打开整个目录结构

补充:由于qt有着完善的对象继承流程,例如前面说的QMainWindow和QDialog都继承QWidget。小部件一般都会继承已经有的窗口类型,使用Qt的插件指针都会默认放在对象树中,可以说不断丰富前端的步骤就是对象树不断向下构建的过程,而在析构函数的过程正好相反,是不断向上析构的过程。也就是说当你释放一个窗口,这个窗口下的所有继承的子窗口都会被析构,而不会泄露内存

换句话说,由于Qt完善的对象树机制,开发者不用考虑复杂的析构。

完结,撒花

2.Qt模块

2.1 从窗口继承到Qt的模块构成

前面就已经说过,QT的窗口是从Qt基础的窗口类别进行继承的,窗口界面的继承关系主要分为三类:QWidget、QMainWindow和QDialog。

QWidget是所有用户界面组件的基类,继承自QObject。它可以作为独立的窗口(顶级窗口),也可以作为其他控件的容器。QWidget没有内置的菜单栏、工具栏或状态栏,适合创建简单的自定义窗口或控件。例如,一个简单的窗口可以通过创建一个QWidget对象并设置其标题和大小来实现。

QMainWindow继承自QWidget,是一个主窗口类,适合创建具有菜单栏、工具栏、状态栏和中心部件的应用程序主窗口。它通常用于复杂的应用程序界面。QMainWindow内置了菜单栏(QMenuBar)、工具栏(QToolBar)、状态栏(QStatusBar)和中心部件(QWidget),并支持停靠窗口(QDockWidget)。例如,一个典型的应用程序主窗口可以通过创建一个QMainWindow对象,并添加菜单栏、工具栏和状态栏来实现。

QDialog也继承自QWidget,是对话框类,用于创建模态或非模态对话框。它适合用于用户输入、配置设置或显示消息。QDialog可以是模态(阻塞其他窗口)或非模态(不阻塞其他窗口),通常包含按钮(如“确定”和“取消”)。例如,一个简单的对话框可以通过创建一个QDialog对象,并添加按钮和布局来实现。

查看默认的mainwindow.文件就能够发现新类继承QMainWindow?

MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){}

这里解释一下,因为Qt独特的父子窗口管理机制(父窗口释放则子窗口也会被释放),所以新建类就会有一个父子窗口界面面的关系链:

比如,在一些情况下,你可能会把MainWindow作为子窗口插入到其他窗口中,或者当你希望有一个窗口能够管理多个窗口关系时,关闭一个窗口就能够管理多个窗口的生命时,传递parent会更方便:

QWidget*parentWindow=newQWidget();MainWindow*mainWindow=newMainWindow(parentWindow);

之后的概念就和C++一样了,只需要在实例化这个类,然后调用这个类就能够显示界面了。

同理,不仅仅是窗口的继承关系,组成Qt之间模块也是这样的继承关系:感谢:

QT类继承结构解析-CSDN博客

    2.2 Qt的模块组成

    上面图片内容太多了,这里缩略的解释:

    首先说一下组成Qt的模块:以下是Qt6中的一些主要模块,(感谢GPT):

    也即是说:学习Qt就是学习这些模块。常见的开发基本上就是1-8模块,后面模块用的就比较少。每个模块之间都有复杂的继承关系

    2.3 举个例子

    参考Qt自动生成的main函数,

    #include#includeintmain(intargc,char*argv[]){QApplicationapp(argc,argv);//创建QApplication对象QWidgetwindow;//创建窗口window.show();//显示窗口returnapp.exec();//进入事件循环}他会使用两个头文件#include#include#include:用于标准库和系统头文件。#include\"\":用于项目中的自定义头文件

    QApplication属于QtCore模块。它是Qt应用程序的核心类,用于管理应用程序的控制流、事件循环以及应用程序的初始化与执行。也即是说在Qt应用程序中,QApplication类负责:

    • 初始化Qt框架。
    • 设置应用程序的主事件循环(通过exec()函数)。
    • 处理命令行参数。
    • 进行全局设置(如应用程序风格、字体等)。
    • 管理应用程序中所有的QWidget(窗口、按钮等控件)。

    在这个例子中,QApplication对象负责初始化Qt系统并启动事件循环,直到在应用程序窗口按下X关闭终止程序。

    思考一下:为什么Qt要做这么多?为什么要有自带事件循环又有自动析构的功能?

    也就是说一个完整的框架,需要有QApplication与QWidget所代表的两个模块(当然,可能名字是模块的继承或者相关的组件,但无论怎么说都用了两个模块的知识点)来实现初步功能。

    QApplication管理整个(控制流、事件循环以及应用程序的初始化与执行)

    QWidget来创建窗口,并实现上位机开发界面。

    由于qt的类继承实际来说其实非常的复杂,某些的时候甚至关乎到你使用cmake编写的.pro文件或者用cmake编程的Cmakelist文件都有关系,所以这里就不一一细说了,用的时候直接deepseek就可以了

    3.初入界面

    3.1 修改界面

    3.2 窗口相关类的介绍

    3.3 开发示例

    吉林旅游网