【QT】QT入门
个人主页~
QT入门
- 一、简述QT
- 1、什么是QT
- 2、QT的优势
- 3、应用场景
- 二、QT的基本使用
- 1、新建项目
- (1)选择项目模版
- (2)选择项目路径
- (3)选择构建系统
- (4)填写类信息设置界面
- (5)选择语言和翻译软件
- (6)选择QT套件
- (7)选择版本控制系统
- (8)创建完毕
- 二、QT的Hello World
- 1、使用按钮实现
- (1)纯代码方式实现
- (2)可视化操作实现
- 2、使用标签实现
- (1)纯代码方式实现
- (2)可视化操作实现
- 三、对象树
- 验证
- mypushbutton.h
- mypushbutton.cpp
- widget.cpp
- 四、QT窗口坐标体系
一、简述QT
1、什么是QT
QT是一个跨平台的C++开发框架,主要用于开发图形用户界面应用程序,但同样支持开发不带界面的命令行程序
这里的图形用户界面是一种人与计算机通信的界面显示格式,允许用户通过图形化的操作元素(如窗口、图标、按钮、菜单等)与计算机进行交互,而无需编写程序代码,图形用户界面的主要目的是使得用户能够更加直观、便捷地操作计算机,提高用户体验,也就是专门提供给非程序员的用户使用,因为并不是所有的用户都会编写代码
2、QT的优势
跨平台性:广泛支持几乎所有主流的操作系统
简单易用性:接口简单,容易上手
高效性:代码执行效率高,可维护性和扩展性好
发展性:有庞大的开源社区,市场份额在上升
它在一定程度上简化了内存回收的机制,并且可以进行嵌入式开发
3、应用场景
QT广泛应用于桌面应用程序,移动应用程序,嵌入式系统
我们熟知的WPS office 就是QT开发的
二、QT的基本使用
前面安装啥的就不再多说了
1、新建项目
(1)选择项目模版
新建项目对话框里一共有五类模版
项目模版 | 说明 |
---|---|
Application | QT应用程序,包括普通窗体程序和QtQuick程序 |
Library | 可以创建动态库、静态库以及QtQuick扩展插件、QtCreator自身插件 |
其他项目 | 可以创建单元测试项目、Qt4设计师自定义控件、子目录项目等 |
Non-Qt-Project | 非QT项目,可以创建纯C/C++项目 |
Import Project | 导入项目,从版本控制管理系统的软件项目导入旧的项目 |
这里我们常用的只有第一种,然后右边会出现四类子模版
Qt Widgets Application:普通窗体模板,传统基于部件的窗体界面程序
Qt Console Application:Qt 控制台应用程序,因为 Qt 主要用于图形界面设计,这个控制台项目模板基本不用
Qt for Python:在Python下用 LGPL 的许可来开发闭源 Qt 软件
Qt Quick Application: Qt 提供的⼀种高级用户界面技术,使用它可以方便快速的为移动以及嵌入式设备开发流畅美观的用户界面,Qt Quick 模块是开发 QML 应用的标准库,提供了使用 QML 创建用户界面所需的一切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等
(2)选择项目路径
就是选择文件保存的位置,注意这个位置一定要全英文
(3)选择构建系统
qmake:是一个构建工具,用于自动生成makefile文件,支持跨平台构建,qmake编辑的是一个后缀为.pro的文件
CMake:是一个跨平台的构建工具,本身不是一个编译器,而是一个能够生成让编译器读懂编译流程的文件工具
Qbs:已经被Qt官方弃用了,不再维护,所以没必要多说了
(4)填写类信息设置界面
上面的红框是基类的选择,目前有三种基类
基类 | 说明 |
---|---|
QMainWindow | 主窗口类,一般用于较为复杂的应用程序,除了中央客户区界面,还包括菜单栏、工具栏、状态栏、以及多个可停靠的工具对话框等 |
QWidget | 最简单最基本的窗体程序,里面可以放置多个控件实现程序功能 |
QDialog | 基于对话框的程序,对话框一般用于弹窗,也可以用于主界面显示,对话框是从QWidget继承而来的,并丰富了一些功能,如模态显示和返回值等 |
它们的关系就是:QWidget是QMainWindow和QDialog的父类
(5)选择语言和翻译软件
这个用不到,当我们的水平走向国际化了,就可以用了
(6)选择QT套件
把安装包的所有东西都下上,直接都选上就行了
(7)选择版本控制系统
蓝框就是如果有GIT仓库(gitee或者github)就可以选择直接传到仓库中,如果没有或者不想传就选择None
红框中是自动生成的文件
(8)创建完毕
其实QT程序的编写窗口是很明了的,感觉跟VS的布局也差不了多少
二、QT的Hello World
既然我们会创建文件了,那么我们就应该动手写第一个QT程序了,和C语言一样,这里我们来写一个Hello World程序
1、使用按钮实现
(1)纯代码方式实现
#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent)
{QPushButton* button = new QPushButton;button->setText("Hello World");button->setParent(this);
}Widget::~Widget()
{
}
先包含按钮的头文件,然后构建一个指针,对指针进行操作,setText是设置文本,setParent是将按钮挂载到对象树上,对象树也是一种树形结构,通过对象树我们可以对树上的对象进行统一的析构,挂载在对象树上的内容才能被窗口显示
按钮默认在窗口左上角
(2)可视化操作实现
双击打开widget.ui文件,将Push Button拖到界面上,双击更改内容
这就是QT编译器自动生成的代码,我们通过自己编写的纯代码方式实现也会被解析成类似的代码
2、使用标签实现
跟上面差不多,不多说了
(1)纯代码方式实现
#include "widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent): QWidget(parent)
{QLabel* q = new QLabel;q->setText("Hello World");q->setParent(this);
}Widget::~Widget()
{
}
(2)可视化操作实现
三、对象树
在QT中创建很多对象的时候会提供一个Parent对象指针,QObject是以对象树的形式组织起来的,,当创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是parent,也就是父类指针
在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children列表
当父对象析构的时候,这个列表中的所有对象也会被析构(不是继承意义上的父对象,而是树意义上的父对象)
QWidget是能够在屏幕上显示的一切组件的父类
QWidget继承自QObject,因此也集成了这种对象树关系,一个孩子自动地成为父组件的一个子组件
当我们删除子对象时,包括它的子对象们会自动从其父对象列表中删除
QT引入对象树的概念在一定程度上解决了内存问题
当一个QObject对象在堆上创建的时候,QT会同时为其创建一个对象树,不过对象树种对象的顺序是没有定义的,任何QObject对象delete的时候,如果这个对象有parent则自动将其从parent的children列表中删除,如果有孩子,则自动delete每一个孩子,可以保证没有QObject会被delete两次
QObject要在堆上创建,且不说栈上的空间小,局部对象的析构顺序是按照其创建顺序的相反过程,但如果子对象先创建,父对象后创建呢,先析构父对象再析构子对象会造成两次析构函数
并且在构造的时候就要指定parent对象
验证
在Hello World处右键选择AddNew,选择C++文件,在蓝框中输入自定义类名以及该自定义类的父类是哪个类,红框是自动勾选的,不用动,下面黑框的一般也不用动,上面是自己修改的类所包含的头文件,中间是自己创建的类的源文件,可以修改最底下的路径
然后点下一步然后点完成就行,手动创建的类会自动添加到目标工程中,然后将自定义的类完善修改一下
mypushbutton.h
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H//#include <QWidget>
#include <QPushButton>
class MyPushButton : public QPushButton
{Q_OBJECT
public:explicit MyPushButton(QWidget *parent = nullptr);~MyPushButton();signals:public slots:
};#endif // MYPUSHBUTTON_H
mypushbutton.cpp
#include "mypushbutton.h"
#include <QDebug>
MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{qDebug() << "按钮构造函数调用";
}MyPushButton::~MyPushButton()
{qDebug() << "按钮析构函数被调用";
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mypushbutton.h"
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);MyPushButton* b = new MyPushButton;b->setText("我的按钮");b->setParent(this);
}Widget::~Widget()
{qDebug() << "Widget析构函数调用";
}
这里使用qDebug的原因是cout打印是GBK,而控制台是按照UTF-8来解析的,正好qDebug也是按照UTF-8来解析的,所以我们就用qDebug了
执行结果反映出对象树确保先释放子节点内存,后释放父节点内存
而析构函数的调用顺序则不一定遵守上述要求,因此看到子节点的析构执行在父节点之后(不能简单的认为调用析构函数就是释放内存)
你想想这样如果是放在栈上那不直接炸肛了吗
四、QT窗口坐标体系
左上角为原点,往右为x轴,往下为y轴
对于嵌套窗口来说,这个坐标是对于父窗口的,也就是父窗口的左上角是原点
通过move函数可以移动控件
今日分享就到这里了~
相关文章:

【QT】QT入门
个人主页~ QT入门 一、简述QT1、什么是QT2、QT的优势3、应用场景 二、QT的基本使用1、新建项目(1)选择项目模版(2)选择项目路径(3)选择构建系统(4)填写类信息设置界面(5&…...
Linux 6.11版本发布
Linux 6.11版本的发布是Linux社区的一个重要里程碑,它不仅在实时计算、性能优化方面取得了显著进展,还在安全性上迈出了关键一步。 一、实时计算与性能优化 1.io_uring子系统支持 Linux 6.11引入了io_uring子系统的增强功能,特别是支持了b…...
CSS 参考手册
CSS 参考手册 概述 CSS(层叠样式表)是一种用于描述HTML或XML文档样式的样式表语言。它用于控制网页的布局和外观,使网页设计更加美观和响应式。CSS可以定义文本颜色、字体、布局、响应式设计等,是网页设计和开发中不可或缺的一部分。 基础语法 CSS的基本语法由选择器和…...
数据采集工具sqoop介绍
文章目录 什么是sqoop?一、Sqoop的起源与发展二、Sqoop的主要功能三、Sqoop的工作原理四、Sqoop的使用场景五、Sqoop的优势六、Sqoop的安装与配置 sqoop命令行一、Sqoop简介与架构二、Sqoop特点三、Sqoop常用命令及参数四、使用示例五、注意事项 什么是sqoop? Sqoop是一款开…...

扫盲:写给UI设计师的SCADA系统知识点
一、SCADA是什么,及其组成。 SCADA(Supervisory Control And Data Acquisition,监控与数据采集系统)是一种用于实时监控、控制和数据采集的自动化系统。 SCADA的组成部分: - 人机界面(HMI*:提…...
类的特殊成员函数——三之法则、五之法则、零之法则
系统中的动态资源、文件句柄(socket描述符、文件描述符)是有限的,在类中若涉及对此类资源的操作,但是未做到妥善的管理,常会造成资源泄露问题,严重的可能造成资源不可用。或引发未定义行为,进而…...

计算机毕业设计 智慧物业服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Python软体中使用SpaCy进行命名实体识别
Python软体中使用SpaCy进行命名实体识别 命名实体识别(Named Entity Recognition,NER)是自然语言处理(NLP)中的一个重要任务,它涉及识别文本中的命名实体,例如人名、地名、组织名等。SpaCy是一种流行的NLP库,提供了高效的NER功能。在本文中,我们将介绍如何使用SpaCy进…...
华为云技术深度解析:以系统性创新加速智能化升级
华为云技术深度解析:以系统性创新加速智能化升级 在当今数字化转型的浪潮中,云计算作为关键的基础设施,正以前所未有的速度推动着各行各业的智能化升级。作为全球领先的云服务提供商,华为云凭借其深厚的技术积累和创新实力&#…...

推理攻击-Python案例
1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法:用模型对训练数据标签进行拟合,拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击(…...
find_box_3d
参数 (ObjectModel3DScene, SideLen1, SideLen2, SideLen3, MinScore, GenParam : GrippingPose, Score, ObjectModel3DBox, BoxInformation) 入参介绍 1,ObjectModel3DScene, 输入的3d模型,这个模型最好是由xyx三通道点…...

Visual Studio2017编译GDAL3.0.2源码过程
一、编译环境 操作系统:Windows 10企业版 编译工具:Visual Studio 2017旗舰版 源码版本:gdal3.0.2 二、生成解决方案 打开Visual Studio 2017的x64本机生成工具,切换到gdal3.0.2源码根目录;执行generate_vcxproj.b…...

计算机网络——email
pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件...

【Linux】信号知识三把斧——信号的产生、保存和处理
目录 1、关于信号的前置知识 1.1.什么是信号? 1.2.为什么要学习信号? 1.3.如何学习信号? 1.4.一些常见的信号 1.5.信号的处理方式 1.6.为什么每一个进程都可以系统调用? 2.信号的产生 2.1.kill命令产生信号…...

【国庆要来了】基于Leaflet的旅游路线WebGIS可视化实践
前言 转眼2024年的国庆节马上就要来临了,估计很多小伙伴都计划好了旅游路线。金秋十月,不管是选择出门去看看风景,还是选择在家里看人。从自己生活惯了的城市去别人生活惯了的城市,去感受城市烟火、去感受人文风景,为2…...
Element-UI Plus 暗黑主题切换及自定义主题色
1. 暗黑主题切换 在main.js中引入下面文件 import element-plus/theme-chalk/dark/css-vars.css安装 vueuse/core pnpm add vueuse/coreApp.vue 添加下面代码 使用了 useDark() 的页面才会从 localStorage中读取当前主题状态,否则,刷新页面就会恢复默…...
人工智能与机器学习原理精解【31】
文章目录 卷积神经网络CNN定义数学原理与公式计算与定理架构例子例题 全连接层的前馈计算定义数学原理与公式计算过程示例 参考文献 卷积神经网络 CNN 即卷积神经网络(Convolutional Neural Networks),是一类包含卷积计算且具有深度结构的前…...

如何安全地大规模部署 GenAI 应用程序
大型语言模型和其他形式的生成式人工智能(GenAI) 的广泛使用带来了许多组织可能没有意识到的安全风险。幸运的是,网络和安全提供商正在寻找方法来应对这些前所未有的威胁。 随着人工智能越来越深入地融入日常业务流程,它面临着泄露专有信息、提供错误答…...

verilog实现FIR滤波系数生成(阶数,FIR滤波器类型及窗函数可调)
在以往采用 FPGA 实现的 FIR 滤波功能,滤波器系数是通过 matlab 计算生成,然后作为固定参数导入到 verilog 程序中,这尽管简单,但灵活性不足。在某些需求下(例如捕获任意给定台站信号)需要随时修改滤波器的…...

OSPF的不规则区域
1.远离骨干非骨干区域 2.不连续骨干 解决方案 tunnel ---点到点GRE 在合法与非ABR间建立隧道,然后将其宣告于OSPF协议中; 缺点:1、周期和触发信息对中间穿越区域造成资源占用(当同一条路由来自不同区域,路由器会先…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...