[Qt的学习日常]--初识Qt

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

  如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正

 

目录

 一、Qt的基本常识

1、什么是Qt

 2、Qt的开发环境

3、Qt 环境变量配置 

二、快速上手QT 

1、创建项目

 2、初始代码解析

3、二种实现hello world的方式

三、认识对象模型(对象树)

1、认识对象树

2、验证对象树 


本期学习:什么是Qt,快速打印hello world的二种方法,对象树是什么。

 一、Qt的基本常识

1、什么是Qt

Qt是一个跨平台的应用程序框架,广泛用于开发图形用户界面应用程序(GUI应用程序),同时也非常适合用于开发非GUI程序,如命令行工具和服务器。Qt是由挪威的Trolltech公司(现为Qt公司,属于Digia)最初开发的,现在它被许多开发者在世界各地使用。Qt是基于C++的,但也提供了与其他编程语言的绑定,如Python、Ruby和Java等。

主要特点:

  1. 跨平台性:Qt可以在多种操作系统上运行,包括Windows、Mac OS、Linux、iOS和Android,使得开发的应用能够在这些平台上无缝运行而无需修改源代码。

  2. 丰富的库支持:Qt提供了广泛的库,从基本的数据结构和IO操作到网络通信和复杂的用户界面设计。它包括工具用于数据库交互、XML解析、文件和网络IO、以及多线程编程等。

  3. 信号与槽机制:Qt的信号和槽机制是一种高级的事件处理系统,允许创建高度可定制的API和强大的事件处理逻辑,而无需回调函数。

  4. 元对象系统:Qt具备一个运行时类型信息系统、动态属性系统和一个强大的事件系统。元对象系统是Qt的核心特性之一,它使得信号和槽机制以及Qt的很多其他功能成为可能。

  5. 工具和IDE:Qt提供了一整套工具来辅助开发,包括Qt Designer(一个拖放式界面设计工具)和Qt Creator(一个功能丰富的集成开发环境)。

这里补充一下:与用户交互的二种模式

  • 命令行界面/终端界面--TUI(Text-based User Interface)
  • 图像化界面--GUI (Graphical User Interface)

 2、Qt的开发环境

Qt ⽀持多种开发⼯具,其中⽐较常⽤的开发⼯具有:Qt Creator、Visual Studio、Eclipse.

在后面的开发中我们用Qt Creator进行开发。

Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤ Qt 框架进⾏应⽤程序开发⽽设 计。(也是官方提供)

QT SDK(Qt Software Development Kit)是一个用于开发应用程序的工具集,主要面向使用Qt库的开发者。Qt是一种跨平台的应用程序框架,被广泛用于开发图形用户界面应用程序,也可以用来开发非GUI程序如控制台工具和服务器。QT SDK提供了一系列工具,帮助开发者设计、编码、测试、调试和发布基于Qt的软件。

这里我们只要完成对QT SDK的安装就可以完成环境的搭建

Qt 下载官⽹:http://download.qt.io/archive/qt/(下载非常慢,建议科学上网)

国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/

安装成功后双击QT Creator出现下面界面就是安装成功了 

 其中我们安装完成DSK后,除了有QT Creator外,还会有上面的工具:

Assistant:这是QT自带的离线的官方文档

Designer:这是QT设计师图像化界面的工具,搭配QT Creator使用

Linguis:QT语言家,对接国外业务用的(启到一键切换语言的作用)

QT Creator:这是我们要用到的集成开发环境

3、Qt 环境变量配置 

为什么要设置环境变量 环境变量是在操作系统中⼀个具有特定名字的对象,它包含了⼀个或者多个应⽤程序将要使 ⽤到的信息。

例如Windows 和 DOS 操作系统中的 path 环境变量,当要求系统运⾏⼀个程序⽽没有告诉它 程序所在的完整路径时,系统除了在当前⽬录下⾯寻找此程序外,还会到 path 中指定的路径 去找。

在 Windows 上设置 Qt 的环境变量是为了能够在命令⾏或其他应⽤程序中直接访问 Qt 相关 的命令和⼯具。

找到Qt的安装路径,复制 "bin" 路径;

"此电脑" ------> ⿏标右键, "属性" ------> "⾼级系统设置" ------> "环境变量"

"新建" ------> 填⼊ "bin" 路径 ------> "确定" ;

二、快速上手QT 

1、创建项目

当我们要选择用QT写开发一个GUI程序就选择下图箭头指的方向就好,其中传统的QT开发GUI的方式就叫做Qt Widgets

文件放置位置

这个是QT的构建工具,我们选择qmake就好了 

  • qmake: qmake 是⼀个构建⼯具(build tool),⽤于⾃动⽣成 makefile ⽂件。qmake ⽀持跨平 台构建。qmake 编辑的是⼀个后缀名为 .pro 的⽂件 

因为我们知道QT其实就是一个框架,当我们使用QT就是在这个框架上进行编写,但我们选择 建立项目就会自动帮助我们生成一下代码,这些代码主要继承下面三个基类。

 对于基类的选择,⽬前有三种基类:

  • QMainWindo w:主窗⼝类,⼀般⽤于较为复杂的应⽤程序,除了中央客⼾区界⾯,还包括菜单栏、⼯具栏、 状态栏以及多个可停靠的⼯具对话框等。
  • QWidget:最简单、最基本的窗体程序,⾥⾯可以放置多个控件实现程序功能
  • QDialog:基于对话框的程序,对话框⼀般⽤于弹窗,也可以⽤于主界⾯显⽰。对话框是从QWidget继 承⽽来的,并丰富了⼀些功能,如模态显⽰和返回值等

 上述三个类之间的关系如下图:

 

图上有一个from filef非常关键QT创建图像化界面的方式有二种:

 直接通过C++代码创建

通过from filem,以图像化的方式,生成界面(可通过QT Designer或者QT Creaor进行ui文件的编写)

后面大家暂时不用了解,一直下一步就好了。

 2、初始代码解析

对于一个刚刚生成的项目,无法就是有头文件,源文件和from file文件组成

 main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);//这里是为了编写一个Qt,图像化界面,而存在的 QApplication对象Widget w;//创建文件时候,定义的类w.show();//创建一个控件对象,并显示出来,.hide指隐藏起来return a.exec();//让程序执行起来
}

  widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//把from file生成的界面和widget关联起来
}Widget::~Widget()
{delete ui;
}

 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT//厷,为了引入Qt的槽和信号public:Widget(QWidget *parent = nullptr);//往对象树中,挂入对象,要指定父节点~Widget();private:Ui::Widget *ui;//和from file有关
};
#endif // WIDGET_H

双击froms目录下的widget.ui就会进入图形化界面编辑器,左侧就是Qt的控件,直接拖拽使用。

点击编辑就是ui的本体,这是一种xml,这里和html非常相似都是使用成对的标签显示数据 

3、二种实现hello world的方式

方法一:通过图形化界面的方式,创建控件打印:

首先进入ui图像化界面模式,找到Label控件,拖拽到图像区域输入hellow world!!!

 方法二、代码实现:在widget.cpp中

#include "widget.h"
#include "ui_widget.h"
#include"QLabel"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//把from file生成的界面和widget关联起来QLabel* label = new QLabel(this);//即可在堆上创建,也可以在栈上创建label->setText("hello world!!!");//这里其实隐式构造了QString
}Widget::~Widget()
{delete ui;
}

这里不知道大家注意到一个细节没有,这里我们并没有让,去delele我们new出来的空间,但是在qt这样是不会找内存泄露的,因为我们把这个对象挂到了对象树中去,对象树会帮助我们在合适的时机释放空间的。 

三、认识对象模型(对象树)

1、认识对象树

在Qt中,每个对象都可以有一个父对象(parent)和多个子对象(children)。当一个对象被创建时,你可以指定它的父对象。一旦父对象被销毁,所有它的子对象也会被自动销毁。这样,开发者就不需要手动管理每个对象的内存,降低了内存泄漏的风险。

其实对象树的本质就是一课N叉树:

2、验证对象树 

为了测试对象树的析构,这里我们显示的打印一下析构过程,这里我们也要重新定义一下我们的 

然后选择我们要继承的类QLabel

 在 Qt Creator 中, 可以通过 F4 切换头文件和对应的 .cpp 文件

完成对应头文件和.cpp文件的编写

mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H#include <QWidget>
#include<QLabel>
class MyLabel : public QLabel
{Q_OBJECT
public:MyLabel(QWidget* parent);~MyLabel();//这里只要按alt+enter,就会在.cpp生成析构函数
};#endif // MYLABEL_H

mylabel.cpp 

#include "mylabel.h"
#include<iostream>MyLabel::MyLabel(QWidget* parent): QLabel(parent)
{}MyLabel::~MyLabel()
{std::cout << "MyLabel 被销毁!!!" << std::endl;
}

widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include<mylabel.h>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);MyLabel* label = new MyLabel(this);label->setText("hello world!!!");
}Widget::~Widget()
{delete ui;
}

运行后,当我们擦掉图像化界面,对象树就会调用析构函数。

虽然我们看到成功调用了析构函数,但是为什么打印出来是乱码,其实这是因为,代码对于生成的是utf8字符集,但是qt终端界面是gbk字符集去解析所以会出现乱码。

为解决这些问题,qt不仅仅为我们提供了QString,可以帮助我们处理编码方式,也提供了专门打印日志的qDeBug()工具

#include "mylabel.h"
#include<iostream>
#include"QDebug"
MyLabel::MyLabel(QWidget* parent): QLabel(parent)
{}MyLabel::~MyLabel()
{qDebug() << "MyLabel 被销毁!!!";
}

后续再 Qt 中,如果想通过打印日志的方式,输出一些调试信息,都优先使用 qDebug. 虽然使用 cout 也行,但是 cout 对于编码的处理不太好,在windows 上容易出现乱码(如果是 Linux 使用 Qt Creator, 一般就没事了,Linux 默认的编码一般都是 utf8)
使用 qDebug,还有一个好处~~ 打印的调试日志,是可以统一进行关闭的!!输出的日志,是开发阶段, 调试程序的时候,使用的,如果你的程序发布给用户,不希望用户看到这些日志的!!qDebug 可以通过编译开关,来实现一键式关闭

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

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

相关文章

代码随想录算法训练营第四十六天| LeetCode139.单词拆分

一、LeetCode139.单词拆分 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html 状态&#xff1a;已解决 1.思路 单词明显就是物品&#xff0c;字符串s明显就是背包&#xff0c;那么问题就变成了物品能不能把背…

数据可视化———Tableau

基本认识&#xff1a; 维度&#xff1a;定性—字符串文本&#xff0c;日期和日期时间等等 度量&#xff1a;定量—连续值&#xff0c;一般属于数值 数据类型&#xff1a; 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符&#xff1a;加减乘除,%取余&#xff0c;…

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘&#xff0c;涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

8.4.3 使用3:配置单臂路由实现VLAN间路由

1、实验目的 通过本实验可以掌握&#xff1a; 路由器以太网接口上的子接口配置和调试方法。单臂路由实现 VLAN间路由的配置和调试方法。 2、实验拓扑 实验拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;配置交换机S1 S1(config)#vlan 2 S1(config-vlan)#exit S…

微服务项目实战-黑马头条(八):App端-文章ES搜索、MongoDB搜索记录和关键词联想

文章目录 一、今日内容介绍1.1 App端搜索-效果图1.2 今日内容 二、搭建ElasticSearch环境2.1 拉取镜像2.2 创建容器2.3 配置中文分词器 ik2.4 使用postman测试 三、app端文章搜索3.1 需求分析3.2 思路分析3.3 创建索引和映射3.4 数据初始化到索引库3.4.1 导入es-init到heima-le…

【七】jmeter5.5+influxdb2.0+prometheus+grafana

参考文章&#xff1a;https://blog.csdn.net/wenxingchen/article/details/126892890 https://blog.csdn.net/Zuo19960127/article/details/119726652 https://blog.csdn.net/shnu_cdk/article/details/132182858 promethus参考 由于自己下载的是infuldb2.0&#xff0c;所以按照…

grafana报错This panel requires Angular (deprecated)

1.原因 报错解释&#xff1a; Grafana在更新到7.0版本后&#xff0c;弃用了AngularJS&#xff08;一种用于构建大型Web应用的JavaScript框架&#xff09;。在早期的Grafana版本中&#xff0c;某些面板可能依赖于AngularJS&#xff0c;但这种依赖已经逐步被新的React或Vue面板所…

智慧安防视频监控EasyCVR视频汇聚平台无法自动播放视频的原因排查与解决

国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流…

Esp8266 - USB开关分享(开源)

文章目录 简介推广自己gitee项目地址:嘉立创项目地址&#xff1a;联系我们 功能演示视频原理图嘉立创PCB开源地址原理图PCB预览 固件烧录代码编译烧录1. 软件和驱动安装2. 代码编译1. 安装所需要的依赖库文件2. 下载源代码3. 烧录代码 使用说明1. 设备配网2. 打开设备操作页面3…

STM32 I²C通信

一、IC总线通信 1.1 IC总线特点 IC&#xff08;Inter Integrated Circuit&#xff0c;集成电路总线&#xff09;&#xff0c;通过串行数据线SDA&#xff08;Serial Data&#xff09;和串行时钟线SCL&#xff08;Serial Clock&#xff09;来完成数据的传输。 特点&#xff1a;…

深度学习-数据预处理

目录 创建一个人工数据集处理缺失的数据插入对inputs中的类别值或离散值&#xff0c;将NaN视为一个类别对inputs和outputs中的数值类型转换为张量格式 创建一个人工数据集 import os import pandas as pd os.makedirs(os.path.join(.., data), exist_okTrue) data_file os.p…

ESP-IDF下载与安装完整流程

本文主要看参考官网说明&#xff0c;如下&#xff1a; Windows 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 一、概述 ESP-IDF需要安装一些必备工具&#xff0c;才能围绕ESP32构建固件&#xff0c;包括&#xff1a; PythonGit交叉编译…

Docker搭建Maven仓库Nexus

文章目录 一、简介二、Docker部署三、仓库配置四、用户使用Maven五、管理Docker镜像 一、简介 Nexus Repository Manager&#xff08;简称Nexus&#xff09;是一个强大的仓库管理器。 Nexus3支持maven、docker、npm、yum、apt等多种仓库的管理。 建立了 Maven 私服后&#xf…

【JAVA】UDP与TCP套接字编程

目录 一、UDP数据报套接字编程 1、DatagramSocket API 2、DatagramPacket API 3、InetSocketAddress API 4、示例一 5、示例二 二、TCP流套接字编程 1、ServerSocket API 2、Socket API 3、TCP中的长短连接 4、示例一 5、示例二 一、UDP数据报套接字编程 1、Datag…

图像处理之模板匹配(C++)

图像处理之模板匹配&#xff08;C&#xff09; 文章目录 图像处理之模板匹配&#xff08;C&#xff09;前言一、基于灰度的模板匹配1.原理2.代码实现3.结果展示 总结 前言 模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹…

第48期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Linux--内核移植(二)移植流程及驱动修改

本文来总结一下如何将 NXP 官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。 一、官方开发板内核测试 NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的&#xff0c;所以我们肯定是以 I.MX6ULL EVK 开发板为参考&#xff0…

的记忆:pandas(实在会忘记,就看作是一个 Excel 表格,或者是 SQL 表,或者是字典的字典。)

pandas 是一个开源的 Python 数据分析库&#xff0c;它提供了快速、灵活和富有表现力的数据结构&#xff0c;旨在使“关系”或“标记”数据的“快速分析、清洗和转换”变得既简单又直观。pandas 非常适合于数据清洗和转换、数据分析和建模等任务。以下是 pandas 的基本概念和主…

简化图卷积 笔记

1 Title Simplifying Graph Convolutional Networks&#xff08;Felix Wu、Tianyi Zhang、Amauri Holanda de、 Souza Jr、Christopher Fifty、Tao Yu、Kilian Q. Weinberger&#xff09;【ICML 2019】 2 Conclusion This paper proposes a simplified graph convolutional m…

第100+6步 ChatGPT文献复现:ARIMAX预测新冠

基于WIN10的64位系统演示 一、写在前面 我们继续来解读ARIMAX模型文章&#xff0c;这一轮带来的是&#xff1a; 《PLoS One》杂志的2022年一篇题目为《A data-driven eXtreme gradient boosting machine learning model to predict COVID-19 transmission with meteorologic…