【QT学习】01:helloqt
helloqt
OVERVIEW
- helloqt
- 一、helloqt
- 1.使用向导创建
- 2.手动创建
- 3.pro文件
- 4.Qt应用程序框架
- 二、按钮创建
- main.cpp
- mywidget.cpp
- 三、对象模型
- 1.对象树引入
- 2.存在的问题
一、helloqt
创建一个qt项目,可以使用creator的向导创建,也可自己手动创建:
1.使用向导创建
-
step1:文件->新建文件或项目,选择Qt Widgets Application(创建一个qt桌面应用,包含一个基于qt设计师的主窗体)
-
step2:填写项目名称,并设置项目存放路径后,选择编译套件(例如:Desktop Qt 5.5.0 MinGW 64bit)
-
step3:向导会自动添加一个继承自CMainWindow的类,可以在此修改类的名字和基类(默认基类有QMainWindow、QWidget、QDialog)

-
step4:向导会默认添加main.cpp、mywidgets.cpp、mywidgets.h和一个.pro项目文件,点击完成即可创建出一个qt桌面程序。
2.手动创建
-
step1:文件->新建文件或项目,添加一个空项目Empty qmake Project,
-
step2:填写项目名称,并设置项目存放路径后,选择编译套件(例如:Desktop Qt 5.5.0 MinGW 64bit)生成一个空项目。
-
step3:在空项目中添加文件,选择C++ Class添加即可。

3.pro文件
.pro 就是工程文件,其是qmake自动生成的用于生产makefile的配置文件,
#包含的模块
QT += core gui#大于Qt4版本才包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets#使用C++11的特性
CONFIG += c++11#应用程序名 生成的.exe程序名
TARGET = QtFirst#应用程序模板类型
TEMPLATE = app#工程中包含的ui设计文件
FORMS += forms/painter.ui#工程中包含的资源文件
RESOURCES += qrc/painter.qrc#工程中包含的源文件
SOURCES += \main.cpp \mypushbutton.cpp \mywidget.cpp#工程中包含的头文件
HEADERS += \mypushbutton.h \mywidget.h# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
关于模板变量变量的配置选项:
- app:建立一个应用程序的makefile,这是默认值,如果模板没有被指定,该选项将被使用。
- lib:建立一个库的makefile
- vcapp:建立一个应用程序的VisualStudio项目文件
- vclib:建立一个库的VisualStudio项目文件
- subdirs:特殊的模板,可创建一个能够进入特定目录、并且为一个项目文件生成makefile、并且为它调用make的makefile
4.Qt应用程序框架
#include "mywidget.h"
#include <QApplication>int main(int argc, char *argv[]) {//1.创建应用程序对象a (在Qt中应用程序对象只能有一个)QApplication a(argc, argv);//2.创建窗口对象 w (窗口对象mywidget父类为QWidget)myWidget w;//3.调用窗口对象的show方法进行窗口显示w.show();//4.让应用程序对象进入消息循环(让代码阻塞在该行)return a.exec();
}
- QApplication应用程序类:
- 管理图形用户界面应用程序的控制流和主要设置,
- 是Qt的整个后台管理的核心包含主事件循环,在其中解决来自窗口系统和其他资源的所有事件处理和调度,也处理应用程序初始化和结束,并提供对话管理。
- 对任何一个使用Qt图形用户界面的应用程序,都正好存在一个QApplication对象(不论此时该应用程序有多少窗口)。
a.exec():程序进入消息循环,等待对用户输入进行响应- main函数将控制权转交给Qt,由Qt完成事件处理工作,当应用程序退出的时候exec的值就会返回。
- 在exec函数中Qt接受并处理用户和系统的事件,并且将它们传递给适当的窗口部件。
二、按钮创建
按钮其实就是一个QPushButton类下的对象,
并利用setParent为其指定一个依赖的父窗口,配合setText显示文字、move移动按钮位置、setWindowTitle修改窗口标题、resize指定窗口大小、setFixedSize设置固定窗口大小,
main.cpp
#include "mywidget.h"
#include <QApplication>int main(int argc, char *argv[]) {//1.创建应用程序对象a (在Qt中应用程序对象只能有一个)QApplication a(argc, argv);//2.创建窗口对象 w (窗口对象mywidget父类为QWidget)myWidget w;//3.调用窗口对象的show方法进行窗口显示w.show();//4.让应用程序对象进入消息循环(让代码阻塞在该行)return a.exec();
}
mywidget.cpp
#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>class myWidget : public QWidget {Q_OBJECT//Q_OBJECT宏 允许类中使用信号与槽的机制
public:myWidget(QWidget *parent = nullptr);~myWidget();
};#endif // MYWIDGET_H
#include "mywidget.h"
#include <QPushButton>myWidget::myWidget(QWidget *parent):QWidget(parent){//1.设置主窗口属性resize(600, 400);//设置主窗口大小setWindowTitle("第一个窗口");//设置主窗口标题setFixedSize(600, 400);//设置主窗口大小固定\//2.创建并设置第一个窗口属性QPushButton *btn = new QPushButton;//创建一个按钮btn->setParent(this);//让btn对象依赖在mywidget窗口中显示btn->setText("QPushBtn1");//显示文本//3.创建并设置第二个窗口属性QPushButton *btn1 = new QPushButton("QPushBtn2", this);//按照控件大小创建窗口btn1->move(100, 0);//移动按钮位置btn1->resize(100, 30);//设置按钮的大小
}myWidget::~myWidget(){ }
三、对象模型
1.对象树引入
QObject是以对象树的形式组织起来的:
注意到Qt在按钮创建时都使用了new操作符在堆区开辟了内存,但是没有进行delete操作?因为其会自动释放,从而不需要delete操作,

在Qt中创建对象的时候会提供一个Parent对象指针,
- 当创建一个QObject对象时,其构造函数会接收一个QObject指针(parent父对象指针)作为参数,相当于在创建QObject对象时,可以为其提供一个父对象,创建的QObject对象会自动添加到父对象的children()列表中。
- 当父对象析构时children列表中的所有对象都会被析构,注意这里的父对象并不是继承意义上的父类,这种机制在 GUI 程序设计中相当有用(简化了内存回收机制)。例如按钮有一个QShortcut对象作为其子对象,当按钮被删除的时快捷键也会被删除。
- 当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过对象树中对象的顺序是没有定义的,这意味着销毁这些对象的顺序也是未定义的。
- 任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。
2.存在的问题
引入对象树的概念,在一定程度上解决了内存问题:
- QObject在栈上创建Qt 保持同样的行为,正常情况下这不会发生什么问题:
{QWidget window;QPushButton quit("Quit", &window);
}
作为父组件的 window 和作为子组件的 quit 都是QObject的子类(事实上,它们都是QWidget的子类,而QWidget是QObject的子类)。这段代码是正确的,quit 的析构函数不会被调用两次,因为标准 C++要求局部对象的析构顺序应该按照其创建顺序的相反过程。因此这段代码在超出作用域时,会先调用 quit 的析构函数,将其从父对象 window 的子对象列表中删除,然后才会再调用 window 的析构函数。
- 但如果将代码修改为下面的代码:
{QPushButton quit("Quit");QWidget window;quit.setParent(&window);
}
这里析构顺序就出现了问题,在上面的代码中作为父对象的 window 会首先被析构,因为它是最后一个创建的对象。
在析构过程中它会调用子对象列表中每一个对象的析构函数,也就是说 quit 此时就被析构了。代码继续执行在 window 析构之后,quit 也会被析构,因为 quit 也是一个局部变量,在超出作用域的时候当然也需要析构。但是这时候已经是第二次调用 quit 的析构函数了,C++ 不允许调用两次析构函数,因此程序崩溃了。
由此得知 Qt 的对象树机制虽然在一定程度上解决了内存问题,但是也引入了一些值得注意的问题。这些细节在以后的开发过程中需要注意,最好从开始就养成习惯:尽量在构造的时候就指定 parent 对象,并且大胆在堆上创建。
相关文章:
【QT学习】01:helloqt
helloqt OVERVIEW helloqt一、helloqt1.使用向导创建2.手动创建3.pro文件4.Qt应用程序框架 二、按钮创建main.cppmywidget.cpp 三、对象模型1.对象树引入2.存在的问题 一、helloqt 创建一个qt项目,可以使用creator的向导创建,也可自己手动创建ÿ…...
学习gRPC (三)
测试gRPC例子 编写proto文件实现服务端代码实现客户端代码 通过gRPC 已经编译并且安装好之后,就可以在源码目录下找到example 文件夹下来试用gRPC 提供的例子。 在这里我使用VS2022来打开仓库目录下example/cpp/helloworld目录 编写proto文件 下面是我改写的exa…...
【html】学习记录
1.在建立一个页面的时候不是打开软件就开始写代码,要先规划好页面的布局框架,不然思想会很混乱,如做个人简历,要分区分块,把每个区域的内容搞清楚。 2.html的很多标签看上去作用都是一样的,但是实际有很大不…...
2023年人工智能技术与智慧城市发展白皮书
人工智能与智慧城市是当前热门的话题和概念,通过将人工智能技术应用在城市管理和服务中,利用自动化、智能化和数据化的方式提高城市运行效率和人民生活质量,最终实现城市发展的智慧化,提升城市居民的幸福感。 AI技术在城市中的应…...
《Python入门到精通》条件控制 if 语句
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 if 语句 1、四种语法格式1.1、if1.2、if else1.3、if elif else1.4、if 嵌套 2、…...
如何编写一个易于维护的考试系统源码
编写一个易于维护的考试系统源码对于开发人员来说非常重要。一个易于维护的系统可以使代码更易于理解、修改和扩展,从而提高开发效率和系统稳定性。 第一步:良好的项目结构 良好的项目结构是一个易于维护的源码的基础。可以按照模块、功能或层次等方式…...
day 2 |977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
目录: 解题及思路学习 977.有序数组的平方 https://leetcode.cn/problems/squares-of-a-sorted-array/submissions/ 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1&a…...
【力扣每日一题】2023.8.2 翻转卡片游戏
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 这道题不是什么翻转卡片游戏,这就是纯纯的文字游戏,要是能看懂题目那就是非常简单,接下来我就给大家分…...
IDEA设置中文 中文插件
IDEA设置中文 中文插件 首先进入idea File --> Setting --> Plugin 输入Chinese 搜索插件 选择下图插件进行install 安装完成后,重启idea即可...
Python——调用webdriver.Chrome() 报错
今天运行脚本,报错内容如下: collecting ... login_case.py:None (login_case.py) login_case.py:11: in <module> dr webdriver.Chrome() D:\Program Files (x86)\Python\Python39\Lib\site-packages\selenium\webdriver\chrome\webdriver.p…...
人工智能发展的五个主要技术方向是什么?
人工智能主要分支介绍 通讯、感知与行动是现代人工智能的三个关键能力,在这里我们将根据这些能力/应用对这三个技术领域进行介绍: 计算机视觉(CV) 自然语言处理(NLP) 在 NLP 领域中,将覆盖文本挖掘/分类、机器翻译和语音识别。 机器人 1、…...
机器学习知识经验分享之六:决策树
python语言用于深度学习较为广泛,R语言用于机器学习领域中的数据预测和数据处理算法较多,后续将更多分享机器学习数据预测相关知识的分享,有需要的朋友可持续关注,有疑问可以关注后私信留言。 目录 一、R语言介绍 二、R语言安装…...
回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循…...
309. 买卖股票的最佳时机含冷冻期
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后,你无法在第二天买入股票 …...
P1119 灾后重建
题目背景 B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,…...
USB采集卡如何打pts
一、使用采集卡提供的pts 二、手动打pts 1.usb采集设备pts的问题 2.采集卡驱动,UVC/UAC,ffmpeg的关系 3.如何自己打pts 4.音视频同步调优 5.NTP等联网调时工具带来的不同步问题 一、使用采集卡提供的pts 我们用使用pc摄像头和使用pc麦克风声卡里的方法&…...
机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)
大家好,我是微学AI,今天给大家介绍一下机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归),这几天引爆网络的科技大新闻就是韩国科研团队宣称发现了室温超导材料-LK-99,这种材料…...
小研究 - 一种复杂微服务系统异常行为分析与定位算法(二)
针对极端学生化偏差(Extreme Studentized &#…...
Docker 安装 MySQL5.6
方法一、docker pull mysql 查找Docker Hub上的mysql镜像 #docker search mysql 这里我们拉取官方的镜像,标签为5.6 #docker pull mysql:5.6 (第一次启动Docker-MySql主要是查看Docker里面MySQL的默认配置,数据位置,日志位置,配…...
vue组件跳层级时的事件处理 (事件的广播与派发)
相信大家一定用过elementui这个组件库,那么对里面的表单组件一定不陌生。 最常用的几个组件就是el-form,el-form-item,el-input,表单校验时的错误提示功能是交给el-form-item来实现的。当el-input填写时触发校验规则,…...
实战部署指南:高效配置SadTalker音频驱动人脸动画的完整方案
实战部署指南:高效配置SadTalker音频驱动人脸动画的完整方案 【免费下载链接】SadTalker [CVPR 2023] SadTalker:Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation 项目地址: https://gitco…...
DDR3自刷新机制在低功耗系统中的优化实践
1. DDR3自刷新机制的核心原理 DDR3内存的自刷新机制是低功耗设计中的关键环节。简单来说,它就像给手机设置飞行模式——系统暂时不需要频繁访问内存时,DRAM芯片会自己管理数据刷新工作,而不是依赖外部控制器持续发号施令。我在设计智能手表项…...
OpenClaw局域网访问配置
根据OpenClaw最新官方文档(截至2026年3月),以下是更新后的局域网访问配置指南,整合了网络架构、安全加固和自动化配对等新特性:一、核心配置命令(基于新版网关协议)启用LAN多接口监听 使用新参数…...
YOLO X Layout实战:商业报告智能解析,快速提取表格与图表数据
YOLO X Layout实战:商业报告智能解析,快速提取表格与图表数据 1. 商业文档处理的痛点与解决方案 在金融分析、市场研究等专业领域,我们经常需要处理大量商业报告。这些PDF或扫描件文档中包含大量有价值的数据表格和图表,但手动提…...
5步实现黑苹果零门槛配置:智能工具的降维打击方案
5步实现黑苹果零门槛配置:智能工具的降维打击方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 当你第三次因为ACPI补丁错误导致系统崩溃…...
别再重装OriginPro了!遇到盗版弹窗,试试这个修改Hosts文件的永久方案
彻底解决OriginPro授权验证问题的技术指南 引言:为何传统方法无法根治授权问题 许多科研工作者和数据分析师都曾遇到过这样的困扰:明明已经安装了正版OriginPro软件,却频繁遭遇"盗版提示"弹窗。更令人沮丧的是,重装系统…...
3步解锁抖音无水印下载神器:让内容备份效率提升10倍的完整指南
3步解锁抖音无水印下载神器:让内容备份效率提升10倍的完整指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,抖音已成为知识传播、文化交流和创意展示的重要平…...
别再只盯着PID了!用STM32 HAL库的PWM差速,让你的5路红外寻迹小车先跑起来
别再只盯着PID了!用STM32 HAL库的PWM差速,让你的5路红外寻迹小车先跑起来 第一次做红外寻迹小车时,我也被各种PID教程绕得晕头转向。直到有天深夜调试时,我突然意识到——为什么非要一开始就用复杂的PID算法?对于简单…...
LabelImg终极指南:3步掌握图像亮度调整技巧,提升标注效率300%
LabelImg终极指南:3步掌握图像亮度调整技巧,提升标注效率300% 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but yo…...
大模型入门指南:小白程序员必看,收藏学习路径!
一、基础通用概念AI(人工智能) 让机器模拟人类智能(感知、推理、学习、决策)的技术总称。 ML(机器学习) AI 的核心分支:让机器从数据中自动学习规律,不用逐条写规则。 DL(…...
