Qt:Qt框架的初步认识和基本使用

news2024/12/25 0:31:26

文章目录

  • Qt是什么
  • Qt的优点
  • Qt开发环境的基本使用
  • 对象树
  • 其他控件
    • 输入框
    • 按钮

本篇总结的是对于Qt框架的基本认识

Qt是什么

Qt框架是一个跨平台的C++图形用户界面应用程序框架,框架是一群大佬发明出来的,帮助新手使用的一个内容,如果没有框架的存在,那么就容易出错,而有了框架的存在,就是限制普通的新手程序员的自由,来帮助新手去进行使用

Qt的优点

  1. Qt跨平台,几乎支持所有的平台
  2. 接口简单,容易上手,学习Qt框架对于学习其他框架来说也有很重要的意义
  3. 一定程度上简化了垃圾回收机制
  4. 开发效率比较高,可以快速构建一个应用程序
  5. 有比较好的市场氛围
  6. 可以进行嵌入式开发

Qt开发环境的基本使用

对于Qt开发来说,使用的一个开发的环境是Qt Creator,那对于这个环境来说,下面讲述一下基本的使用方式和对应的选项意义

首先是创建一个项目,直接进行新建即可

在这里插入图片描述
那对于新建之后的选项,就有不同的类型了,这里由于是初学,所以只选择一个基础的选择,如果想要用Qt去完成一个GUI程序,那么就要选择第一个选项,对于下面的选项也进行注释和备注:

在这里插入图片描述
接着会有下面的界面

在这里插入图片描述
那么这个里面包含的这三项是什么呢?

这是一个构建系统,通过Qt写的程序,会涉及到一系列的元编程技术,也就是说用代码来生成代码

那Qt框架在进行编译的时候,会自动调用一系列的生成工具,基于用户本身写的代码,生成一系列的其他的C++的代码,最终进行编译的代码,其中也包含了这些最后生成的这些代码,这就是构建系统

那在上面的这三种中,其中qmake是一个老牌的Qt构建工具,而CMake并非是Qt的专属构建工具,许多开源项目中都会用到CMake,而最后的Qbs是一个新一代的构建工具,但是对于现在来说,使用的场景比较少

再下一个是这一步:

在这里插入图片描述
上图所示的是,当使用Qt Creator创建项目,会自动的生成一些代码出来,而此时这个生成的代码中就会包含一个基本的列,而在这个界面选项中要选择的就是一个自动生成的类的父类是什么

  1. QMainWindows:这个类可以生成一个完整的应用程序窗口,包含有菜单栏,工具栏,状态栏等
  2. QWidget:这个类表示一个控件,也就是窗口上的一个具体的元素,例如有输入框,按钮,下拉框,单选按钮,复选按钮等等
  3. QDialog:这个类表示的是一个对话框

在Qt页面中,内置的类都是用Q前缀开头来表示的

关于form file:

在这里插入图片描述
这个form file在Qt框架中扮演者非常重要的角色,Qt中创建图形化界面的程序主要有以下两种方式:

  1. 直接通过C++代码的方式进行创建界面
  2. 通过form file,用图形化的方式来生成界面,此时就可以通过这个Qt Designer或者直接使用Qt Creator来编辑这个ui文件,从而用图形化的方式快速的方便的创建出这个图形界面

再之后就是关于基于哪个编译器进行构建后续代码

在这里插入图片描述

对象树

我们创建一个项目,初步使用一下QT框架:

在这里插入图片描述

在这个项目中创建了一个标签,并且写入了一个内容,那么此时进行运行出结果为:

在这里插入图片描述
此时,的确运行出了一个标签,上面打印的是我们想要的内容,那么这也就意味着初步实现了目的,但是是否有这样的问题:

new的对象,难道不会导致内存泄漏吗?

事实上,这个问题是存在的,但是在QT框架中已经解决了这个问题,具体的解决措施就是对象树:

#include "widget.h"
#include "ui_widget.h"

#include <QLabel>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel* label = new QLabel(this);
    label->setText("hello world");
}

Widget::~Widget()
{
    delete ui;
}

那么解决的方式就是,new的时候把this传递进去了,也就是说是把整个对象的生命周期统一交给了这个QT对象树来进行管理,所以在这个代码中,QT的控制下是不会造成内存泄漏的,label对象会在合适的时候进行析构,因为这个对象已经在对象树上了

那么什么是对象树呢?

在前端开发当中,也会有这样的对象树的概念,DOM本质上就是一个树形结构,也就是所谓的N叉树,通过树形结构把界面上的元素组织起来,而在QT中也是这样的道理,具体的可以用下面的图来进行表示

在这里插入图片描述
实验验证

所以下一步,我们就创建对应的实验过程来验证析构的过程:

// mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class MyLabel : public QLabel
{
public:
    MyLabel(QWidget* parent);
    ~MyLabel();
};

#endif // MYLABEL_H
// mylabel.cpp
#include "mylabel.h"
#include <iostream>

MyLabel::MyLabel(QWidget* parent) : QLabel(parent)
{

}

MyLabel::~MyLabel()
{
    std::cout << "MyLabel delete" << std::endl;
}

运行结果如下:

在关闭框后,就会打印出这个日志信息,说明的确已经把信息析构了
在这里插入图片描述
在QT中,存在专门打印调试信息的类,这里演示其中的一个用法,它也可以用来处理中文:

在这里插入图片描述

其他控件

输入框

下面介绍一种使用输入框来显示hello world的方式

这种比较简单,就不再贴代码了

在这里插入图片描述

按钮

这里我们使用一个pushbutton,也就是普通按钮,来显示hello world

在这里插入图片描述
添加后,运行确实可以显示出结果

在这里插入图片描述
但是遗憾的是,点这个按钮没有任何回显,这不符合按钮的设计初衷,因此就引入了信号与槽的概念,这里只讲述最基本的理解:就是可以点击这个按钮后,去执行一个新的函数

这里首先引入一个函数,connect,对于这个函数来说并不陌生,它和Linux中的socket中的connect有些类似,但也不太一样,具体看用法:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::Handler);
}

Widget::~Widget()
{
    delete ui;
}

void Widget:: Handler()
{
    if(ui->pushButton->text() == QString("hello world"))
        ui->pushButton->setText("hello Qt");
    else
        ui->pushButton->setText("hello world");
}

如上所示,即可实现一个切换按钮显示内部文字的功能:

点击前:

在这里插入图片描述
点击后:

在这里插入图片描述
那这是如何做到的呢?

先看一下这个connect函数:

connect(ui->pushButton, &QPushButton::clicked, this, &Widget::Handler);

这一行的信息是代表了什么意思呢?

简单来说,第一个参数的意思是谁发出的信号,第二个参数意思是发出了什么信号,第三个参数意思是谁来处理这个信号,第四个参数意思是怎么来进行处理

结合到上面这个例子,我们可以看出的结论是,这个函数表示的意思是说,让ui指针指向的按钮对象可能会发出信号,发出的信号是一个点击信号,这个信号让当前对象来进行处理,处理的方式是执行Handler函数,这就是上面这个的基本意思

那么我们该如何理解这个流程呢?

首先要理解,ui是什么,这个->是在做什么?

这个过程本质上就是在访问到form file当中所创建的控件,具体如下所示:

在这里插入图片描述
在QT创建一个控件的时候,就会给这个控件分配一个Name的属性,这个属性的值在整个页面当中是唯一的,而在qmake进行预处理的时候,就会根据这里的名字来进行对应的C++代码的生成

而当这个按钮被点击的时候,本质上就会找到这个按钮的名字,然后进行识别

而在使用自动化构建工具构建时,就会依据这个Name,然后生成具体的内容:

在这里插入图片描述
在objectName当中,设置的是什么值,具体的就会生成的变量是什么值,之后就会通过这个变量来获取到对应的空间的变量了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KUKA机器人如何给IO信号或寄存器添加中文注释信息?

KUKA机器人如何给IO信号或寄存器添加中文注释信息? 如下图所示,首先,我们需要登录专家以上用户权限(默认密码KUKA), 如下图所示,点击“投入运行”—“网络配置”, 如下图所示,此时机器人的IP地址为192.168.1.10, 如下图所示,用一根网线连接机器人控制柜到笔记…

使用ClassFinal实现springboot项目jar包加密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

高级IO|从封装epoll服务器到实现reactor服务器|Part2

项目复习&#xff1a;从封装epoll_server到实现reactor服务器(part2) 项目复习&#xff1a;从封装epoll_server到实现reactor服务器(part2) 基本结构搭建好为什么上面我们写的epoll的recv是不正确的&#xff1f;sock要封装了&#xff0c;要维护缓冲区封装epoll(1)继续先写tcp_…

【算法刷题 | 贪心算法07】4.29(用最少数量的箭引爆气球、无重叠区间)

文章目录 12.用最少数量的箭引爆气球12.1题目12.2解法&#xff1a;贪心12.2.1贪心思路12.2.2代码实现 13.无重叠区间13.1题目13.2解法&#xff1a;贪心13.2.1贪心思路13.2.2代码实现 12.用最少数量的箭引爆气球 12.1题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面…

js之JSON

json 是一种轻量级的数据交换格式。 json 就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互。 let data {name:张三,age:18}; console.log(data); // 对象 let str JSON.stringify(data); console.log(str); // json 数据 l…

3D模型在线查看利器,支持多种模型格式!

作为3D设计师&#xff0c;你是否曾遇到过这样的烦恼&#xff1a; 客户想看设计好的3D模型作品&#xff0c;但是客户身边没电脑&#xff0c;或者电脑没有3D查看器&#xff0c;又不会使用三维软件&#xff0c;从而无法及时查看模型。 还有就是&#xff0c;自己累积了很多3D模型作…

网易云怎么改IP地址到其他城市

在数字音乐的时代&#xff0c;网易云音乐以其丰富的音乐库和个性化的推荐算法赢得了众多用户的喜爱。然而&#xff0c;有些用户可能会遇到一个问题&#xff1a;自己的IP地址显示的是家乡或当前所在的城市&#xff0c;但自己希望显示的是其他城市。那么&#xff0c;网易云音乐是…

解决TIVA飞控玄学类问题的通解,用魔法打败魔法

问题&#xff1a;我遭遇了玄学问题&#xff0c;出现飞机在起降过程中&#xff0c;位置晃动&#xff0c;突然出现的&#xff0c;昨天还好好的&#xff0c;位置地点都没换&#xff0c;今天中午测试了5、6次每次都这样&#xff0c;现在茫然无措&#xff0c;小哥救我&#xff1f; 这…

手写 轮播效果

此处只做了手动点击的效果,未处理自动轮播,基于vue2书写 , 逻辑: 点击左边的图标,进行上一个处理,若此时在第一项,则return,否则将当前所在数据-1;点击右边的图标,进行下一个处理,若此时在最后一项,则return,否则将所在数据1;当单独点击某数据时,若当前就是点击项,则return,否…

与 Apollo 共创生态:探索智能驾驶新时代

前言 随着百度Apollo的七周年大会在北京车展前夕成功举办&#xff0c;我们迎来了一场关于智能汽车未来的思想盛宴。在这次主题为“破晓•拥抱智变时刻”的盛会上&#xff0c;百度Apollo发布了一系列令人振奋的智能驾驶产品&#xff0c;从领航辅助驾驶到智能座舱&#xff0c;再到…

[C++][算法基础]区间覆盖(贪心 + 区间问题4)

给定 &#x1d441; 个闭区间 [&#x1d44e;&#x1d456;,&#x1d44f;&#x1d456;] 以及一个线段区间 [&#x1d460;,&#x1d461;]&#xff0c;请你选择尽量少的区间&#xff0c;将指定线段区间完全覆盖。 输出最少区间数&#xff0c;如果无法完全覆盖则输出 −1。 …

界面组件DevExpress中文教程 - 如何在Node.js应用中创建报表?

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 获取DevExpress Reporting最新正式版下载(Q技术…

电商日志项目(一)

电商日志项目 一、项目体系架构设计1. 项目系统架构2. 项目数据流程二、环境搭建1. NginxLog文件服务1.1. 上传,解压1.2. 编译安装1.3. 启动验证2. Flume-ng2.1. 上传解压2.2. 修改配置文件2.3. 修改环境变量2.4. 验证3. Sqoop3.1. 上传解压3.2. 配置环境变量3.3. 修改配置文件…

「玻尔曾孙」领衔!超辐射原子,重塑全球精准测时——

超辐射原子能够帮助我们以前所未有的精度测量时间。在哥本哈根大学最近的一项研究中&#xff0c;研究人员开发了一种新的测量时间间隔&#xff08;秒&#xff09;的方法&#xff0c;这种方法克服了目前最先进原子钟面临的一些限制。 这一成就有望在多个领域产生深远影响&#x…

el-date-picker 禁用时分秒选择(包括禁用下拉框展示)

2024.04.26今天我学习了对el-date-picker进行禁用时分秒&#xff0c; 在使用el-date-picker组件的时候&#xff0c;我们有可能遇到需要把时分秒的时间固定&#xff0c;然后并且不能让他修改&#xff1a; 1714120999296 比如右上角的这个时间&#xff0c;我们要给它固定是‘08:…

Flask模版详解

Flask模版详解 概述Jinja2模板引擎渲染模版的步骤变量控制结构自定义错误页面链接静态文件 概述 模板是一个包含响应文本的文件&#xff0c;其中包含用占位变量表示的动态部分&#xff0c;其具体值只在请求的上下文中才能知道。使用真实值替换变量&#xff0c;再返回最终得到的…

Android4.4真机移植过程笔记(三)

如果文章字体看得不是很清楚&#xff0c;大家可以下载pdf文档查看&#xff0c;文档已上传&#xff5e;oo&#xff5e; 7、安装加密APK 需要修改文件如下&#xff1a; 相对Android4.2改动还是蛮大的&#xff0c;有些文件连路径都变了: //Android4.2 1、frameworks/native/libs…

如何运用结构化思维来规划个人发展

结构化思维不仅在工作中非常有用&#xff0c;在日常生活中同样可以发挥巨大作用。无论是解决家庭琐事、规划个人发展&#xff0c;还是做出重要决策&#xff0c;结构化思维都能帮助我们更有条理地思考和行动。 一、解决生活中的问题 生活中总会遇到各种各样的问题&#xff0…

Unity+Shader入门精要-1. 入门shader

今天开始正式整合学习的shader内容。 Simple Shader 主要介绍了大概的shader格式。 Shader "Unity Sgaders Book/Chapter 5/Simple Shader" //shader名 {Properties{//声明color类型的属性_Color("Color Tint", Color) (1.0,1.0,1.0,1.0)}SubShader{Pa…

【SpringBoot】数据脱敏

文章目录 什么是数据脱敏JsonSerialize自定义Jackson注解定制脱敏策略定制JSON序列化实现脱敏工具类 定义Person类&#xff0c;对其数据脱敏模拟接口测试总结 什么是数据脱敏 数据脱敏&#xff0c;也称为数据的去隐私化或数据变形&#xff0c;是一种技术手段&#xff0c;用于对…