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

【Qt】Qt 基础

目录

一、软件下载

二、环境配置

三、新建项目

1、新建项目

2、选择项目模板

3、选择项目路径

4、选择构建系统

5、填写类信息设置界面

6、选择语言和翻译文件

7、选择 Qt 套件

8、选择版本控制系统

四、项目文件解析

1、xxx.pro

2、widget.h

3、widget.cpp

4、main.cpp

5、widget.ui

五、使用Qt显示Hello World

1、使用图形化界面生成

2、使用代码生成

六、Qt 基础概念

1、Qt Creator中常用的快捷键

2、对象树

3、窗口坐标体系


一、软件下载

软件下载:Index of /archive/qt

        本文下载的是5.14.2版本,用户进入网址后下载目标版本即可。

        下载后进行安装,安装时需要选中 MinGW 7.3.0 64-bit,该为Windows下的 Qt 编译模块。下载该插件后可以在 Qt 中进行 C++ 开发。安装路径不能包含中文字符!

二、环境配置

        下载好 Qt 后,需要将 Qt 添加到环境变量。

三、新建项目

        当下载配置好 Qt 后,就可以进行 Qt 开发了,以下简单介绍下新建项目时各个界面。

1、新建项目

        点击 文件 后选择 新建文件或项目 或者点击 New 按钮新建项目。

2、选择项目模板

项目模板说明
ApplicationQt应用程序、包括普通窗体程序和QtQuick程序
Library可以创建动态库、静态库以及Qt Quick扩展插件、Qt Creaor自身插件
其他项目可以创建单元测试项目、Qt 4设计师自定义空间、子目录项目等
Non-Qt-Project非 Qt 项目,可以创建纯 C 或者 C++ 项目
Import Project导入项目。从版本控制系统管理的软件项目导入旧的项目

3、选择项目路径

        选择名称和项目路径时不要包含中文。

4、选择构建系统

构建工具:

  • qmake:qmake是一个构建工具,用于自动生成 makefile 文件,支持跨平台构建。qmake 编辑的是一个后缀名为.pro的文件;
  • Cmake:Cmake是一个跨平台的构建工具,属于第三方工具。
  • Qbs:同 qmake、Cmake 一样都是构建工具,目前因市场原因被弃用。

        默认选择 qmake 即可。

5、填写类信息设置界面

        该界面是选择基类和是否构建ui设计界面。本文选择Qwidget基类。

基类说明
QMainWindow主窗口类,一般用于较为复杂的应用程序,除了中央客户区界面,还包含菜单栏、工具栏、状态栏以及多个可停靠的工具对话框等
Qwidget最简单、最基本的窗体程序,里面可以防止多个控件实现程序功能
Qdialog基于对话框的程序,对话框一般用于弹窗,也可以用于主界面显示。对话框是从 Qwidget继承而来的,并丰富了一些功能,入模态显示和返回值等

6、选择语言和翻译文件

        该选项是用于控制项目语言以适应国际化。此时的语言指的是自然语言而不是编程语言。

7、选择 Qt 套件

        如果按照本文的安装步骤,这里应该只有一个选项。

        Qt 套件是指 Qt 程序从编译链接到运⾏环境的全部⼯具和 Qt 类库的集合,对于 MinGW 版本 Qt 程序⽣成和调试,⾄少需要 MinGW 中的编译器 g++(⾃动调⽤链接器)、g++ 配套的基础库、调试器 gdb 还 有使⽤ MinGW 环境编译⽽成的 Qt 类库⾃⾝。默认情况下,在上⾯ Kit Selection ⾥选中全部套件。

8、选择版本控制系统

        这里是选择是否进行版本控制。

四、项目文件解析

        当新建好项目后就是如下界面

1、xxx.pro

        工程新建好后,在工程列表中有一个后缀为".pro"的文件,该文件即工程文件,它是 qmake 自动生产的用于生成 makefile 的配置文件。

2、widget.h

        如果想在 Qt 中使用信号与槽的机制就必须加入 Q_OBJECTR 宏。其中有个私有成员变量 Widget* ui,该指针是用前面声明的 namespace UI 里的 Widget 类定义的,可以通过该指针访问可视化设计界面上的所有组件。

3、widget.cpp

4、main.cpp

5、widget.ui

        ui文件本质是一个 xml 文件,当双击 widget.ui 时会进入 Qt 设计模式,在该模式下可以直接拖拽空间进行界面开发。。⽤ UI 设计器可视化设计的界⾯都由 Qt ⾃动解析,并以 XML ⽂件的形式保 存下来。在设计界⾯时,只需在 UI 设计器⾥进⾏可视化设计即可,⽽不⽤管 widget.ui ⽂件是怎么⽣成的。

五、使用Qt显示Hello World

1、使用图形化界面生成

        双击 widget.ui 进入图形化设计。

        直接将标签拖入界面并编辑运行即可。

2、使用代码生成

        双击 widget.cpp 进行编辑。

六、Qt 基础概念

1、Qt Creator中常用的快捷键

  • 注释:ctrl + /
  • 运行:ctrl + R
  • 编译:ctrl + B
  • 查找:ctrl + F
  • 整行移动:ctrl + shift + ⬆/⬇
  • 帮助文档:F1
  • 自动对齐:ctrl + i
  • 同名之间的 .h 和 .cpp 文件切换:F4
  • 生成函数声明的对应定义: alt + enter

2、对象树

        在上文创建标签 Hello World 时采用的是在堆上新建对象并且传入了 this 指针,该操作实际就是将新建标签挂在到对象树中,也就是 Label 组件作为 Widget 窗口的子组件。

        那么这样做的优势是什么呢?实际 Qt 引入对象树的概念在一定程度上解决了内存泄漏的问题。在上面的代码中在堆上新建了一个标签对象且没有释放,但实际这样并不会产生内存泄漏问题,这是因为对象树的特性解决了该问题。

        当一个 QObject 对象在堆上创建时,Qt 会同时为其创建一个对象树。任何对象树中的 QObject 对象 delete 时,如果该对象有 parent,则自动将从 parent 的 children() 列表中删除,也就是失去父子关系;如果 delete 的对象有孩子,则自动 delete 其每一个孩子(此处的父子关系非继承中的父子关系)。

        也就是以上代码中,当我们关闭窗口时,在对象新建且挂在对象树中的对象会自动被释放,无需程序员手动释放。

        QObject 是以对象树的形式组织起来的,当创建一个 QObject 对象时,可以为其提供一个父对象,而创建的 QObject 对象 会自动添加到其父对象的 children() 列表中。当父对象析构时,该列表中所有的对象也会被析构。

        上图代码中 Widget类 实际继承于 QWidget类,可以代码 widget.h头文件看到该继承关系。

        在 Qt 框架中,采用面对对象的思想。Widget类继承于QWidget类,而QWidget类实际继承于QObject类(Qt中核心基类),此处的QObject指的是基类,而上文中QObject 对象 指的是新建的控件对象的总称。

        但以上都是在堆上新建对象,那么假如新建的对象是在栈上会发生什么呢?

        新建一个 MyLabel 类继承 QLabel 类并编写 MyLabel 类的析构函数进行输出。

        并重新在 Widget.cpp 文件中编写程序:

        此时再运行程序会发现,即使没有关闭窗口,但是标签仍然被销毁了。这是因为目前的代码是在 widget 对象构造函数中的,因此出作用域后标签就会被销毁。

3、窗口坐标体系

        坐标体系:以左上角为原点,X向右增加,Y向下增加。需要注意的是该左上角是指父控件的左上角并不是整个屏幕的左上角。例如以下代码中(200,300)的位置是相对于 widget 对象左上角的位置。

http://www.xdnf.cn/news/14367.html

相关文章:

  • Redis-CPP通用接口
  • Leetcode 3584. Maximum Product of First and Last Elements of a Subsequence
  • 139. 单词拆分
  • (LeetCode 每日一题) 1432. 改变一个整数能得到的最大差值(贪心)
  • React组件通信——context(提供者/消费者)
  • MySQL常用函数详解之字符串函数
  • nohz_full 参数对内核软硬锁检测机制的影响分析
  • 嵌入式学习笔记 - SH79F6441 堆栈栈顶可以是片上内部RAM(00H-FFH)的任意地址怎么理解
  • (91)课113:存储函数与存储过程的区别总结。
  • DP刷题练习(三)
  • Golang 解大整数乘法
  • Python Pillow 库详解文档
  • pythton 语言的独特语法
  • Axure应用交互设计:多种类型元件实现新增中继器数据
  • 【springcloud】快速搭建一套分布式服务springcloudalibaba(五)
  • Python爬虫实战:研究Mr. Queue相关技术
  • 【Java SE】类和对象(3)
  • Kafka源码P2-生产者缓冲区
  • 基于大模型预测缺铁性贫血的综合技术方案大纲
  • 记录一次 Oracle 表空间不足问题的解决过程
  • Linux进程间通信(上)
  • Proteus8.17-LCD12864液晶屏幕仿真模型
  • 华为OD机试-考勤信息-双指针(JAVA 2025B卷)
  • AI是什么?大模型、语料、训练、推理、机器学习、神经网络等专业名词如何关联
  • 基于docker的nocobase本地部署流程
  • CPU的异常处理
  • PC16550 UART接收中断处理完整示例代码
  • 134-135Elements-UI组件库
  • 03- 六自由度串联机械臂(ABB)动力学分析
  • SoftMax 函数