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

QT跨平台应用程序开发框架(2)—— 初识QT

目录

一,创建helloworld

1.1 通过图形化

1.2 通过代码

1.3 通过编辑框

1.4 使用按钮

二,对象树

2.1 关于对象树

2.2 演示释放流程

三,乱码问题

3.1 为什么会有乱码问题

3.2 解决乱码问题

四,认识Qt坐标系

五,周边

5.1 命名规范

5.2 快捷键

5.3 如何使用帮助文档


一,创建helloworld

在窗口上打印helloworld我们有两种方式:

  • 一种是通过图形化的方式,在界面上创建出一个控件,显示helloworld
  • 另一种是通过纯代码的方式,通过编写代码在界面上创建控件,显示helloworld

1.1 通过图形化

先双击 .ui 文件来到图形化编辑页面:

然后就会在页面的右上方显示我们安装的控件:

最后我们点击左下角运行按钮,我们创建的窗口上就会显示一个hello world字符串

1.2 通过代码

  • 在我们项目的 widget.cpp 文件中,有一个构造函数:
  • 如果我们要通过代码去构造界面,一般都会把构造界面的代码放在 Widget/MainWindow类的构造函数里面,注意只是创建并不是使用
  • 我们要使用一个类,一般都要加上对应的头文件,并且一般每个类都有一个对应同名的头文件,之后就可以接在构造函数中new一个QLabel,在堆上创建;或者直接在栈上创建,Qt更推荐在堆上创建,原因我们后面的对象树再详细讲讲:
  • 另外,我们在new对象时,建议把this也放进去,就是new QLabel(this); 这个表示给这个label对象指定一个父对象,这点我们对象树再详细讲讲

在包含头文件时,可能会出现两个头文件:

  • 像第二个qlabel.h 这种是上古时期的头文件命名风格,比较Qt是1991年出来的, 那时候的C++编程还是比较荒蛮的状态
  • 直到1998年C++ 推出了 C++98 标准,规定包含头文件,统一使用 #include<cstdio> 代替C语言的 #include<stdio.h>

之后我们就可以往label对象里面设置一个文本:

关于QString类型:

  • Qt诞生于1991年,C++还未形成标准,C++也就没有“标准库”这样的概念
  • 所以在那个年代如何表示一个字符串,有很多方式,比如C风格的字符串(\0结尾),或者是C++的string
  • 但是在当时,STL也还没有搞起来,什么都不太好用,于是Qt自己搞了一套轮子,也就搞了一系列基础类来支持Qt的开发,比如字符串QString,动态数组 QVector,还有链表QList字典 QMap等
  • 虽然后面有了 C++标准和STL,但是想要Qt直接舍弃原有的内容,也不太现实,所以只能和现有的标准库中的容器类共存了
  • 所以我们自己在开发过程中要使用容器类,两者都可以是使用,但是在Qt原生的 api 中,涉及到的接口,用的都是Qt自己那一套容器,比如上面的设置文本,很多方法的参数都是Qt的容器类而不是STL的
  • 但是QString用起来要比 std::string香很多,因为QString内部已经对字符编码做了处理,和java一样,而不像std::string那样啥也没干,所以不经常出现乱码问题

之后直接运行,窗口也就会显示出hello world了 ,只是默认在左上角,如果要想放到其它位置,也可以做到,后面会详细讲解

问题:我们以new创建的对象,但是最后没有delete,会出现内存泄漏吗

解答

  • 上述代码不会有内存泄漏,label对象会在合适的时候自动释放
  • 主要的原因,就是我们前面构造的时候,把this给传进去了,也就是把这个对象挂在了对象树上,下面我们就来详细了解下对象树

1.3 通过编辑框

Qt中有两种编辑框:①单行编辑框(QLineEdit)    ②多行编辑框(QTextEdit)

我们要用到的控件是Input Qidgets下的Line Edit,也是最简单的单行编辑框

当然,也可以用代码来创建编辑框,并且方式和上面是非常相似的:

1.4 使用按钮

按钮控件位于Buttons目录下的Push Button:

但是目前这个按钮能点击,但是没有反馈,也正常,因为我们还没有设置,我们要想让这个按钮点击后有反馈,需要用到Qt中一个非常重要的机制叫做“信号槽机制”,这个我们后期再详细介绍,这里我们先简单演示下:

别忘记在widget.h里声明函数哦:

效果如下:

问题:connect的第一个参数是如何访问到具体某个控件的?

解答:这时候Qt Designer右下角那一坨东西就有用了:

  • 我们在Qt Designer中通过拖拽方式创建一个控件的时候,会给这个控件分配一个objectName属性
  • 这个属性的值是在这个页面中唯一的,比如上面我们搞了两个按钮,对应的objectName就不一样
  • qmake会根据objectName生成对应的C++代码,其中QPushButton对象的变量名字就是这里的objectName,这个变量就是ui属性中的成员变量
  • 这个objectName也可以自己修改

上面是通过拖拽方式创建按钮,下面我们通过代码来创建按钮:

二,对象树

2.1 关于对象树

前端开发(网页开发)也涉及到类似对象树(DOM),本质上也是一个树形结构(N叉树),用于组织页面上的各种结构

Qt中也是类似,也是搞了一个对象N叉树,把界面上的各种元素组织起来,比如我们的页面大概长这样:

那么对象树就大概长这样:

  •  用对象树把这些内容组织起来,最主要的目的,就是能够对这些对象统一管理,比如统一释放,这点和我们Linux里的“先描述,再组织”的目的非常相似

问题:上面这些对象统一销毁是最好的,那么如果是一个对象先销毁了,会发生什么?

解答:会导致对应的控件在页面上无法显示,导致对应的控件在页面上不存在了

所以我们以new的方式创建对象,就是为了把这个对象的生命周期,和 Qt 对象树的生命周期进行同步,所以对象会随着对象树的销毁统一全部销毁,并且也方便管理

问题:如果改为在栈上创建对象会发生什么?

解答:如下图:

2.2 演示释放流程

上面说一大堆对象树方便释放,但是实际效果并不明显,下面我们自己搞一个QLabel类,然后打印一些东西来演示释放效果:

①创建对应的C++文件:

 

然后就多出了两个文件:

②实现mylabel.h

由于我是习惯与函数声明和定义放一起写的,所以mylabel.cpp没有用到,大家也可以按照自己的方式写,下面是MyLabel类也就是mylabel.h的实现:

#ifndef MYLABEL_H
#define MYLABEL_H#include<QLabel>
#include<iostream>
class MyLabel : public QLabel
{
public:MyLabel(QWidget* parent) //用带参数的构造函数,这样才能确保自己的对象能够加到对象树上:QLabel(parent){}~MyLabel(){std::cout << "MyLabel 已销毁!" << std::endl;}
};#endif // MYLABEL_H

③在widget.cpp中创建并调用MyLabel类 

 

④查看效果

注意,析构函数是对象销毁时才会调用,所以当窗口生成出来要再关闭后,才会调用析构函数,如下动图:

可以看到析构函数能够进行打印,但是这里出现了乱码,下面我们来解释并解决一下

三,乱码问题

3.1 为什么会有乱码问题

乱码问题我们后面会经常涉及到,但是乱码出现的原因大部分情况下只有一个,就是“编码方式不匹配

问题:在计算机中,一个汉字占几个字节?

解答

  • 绝大多数的人回答时都会即答“2个字节”,但是实际上,针对这个问题,只要回答一个具体的数字,100%是错的,因为我们需要搞清楚一个前提条件,就是我们当前的中文编码是哪种方式(字符集)
  • 计算机存的是二进制,英文字母和很多符号我们是用ASCII码表搞得,规定了每个字符都有由一个数字来表示就够了,因为英文就那么多
  • 我们常用的汉字大概是4千左右,算上各种生僻字的话,大概有6w多个,所有就搞了一个更大的表格用更大的数字来表示汉字了,对于计算机来说6w多个符号的表格没有什么压力的,但是这个表格是什么样子,具体每个汉字用哪个数字表示,就有很多种了

目前表示汉字字符集我们主要是两种方式:

  • ①GBK,使用2个字节的大数字表示一个汉字,我们Windows简体中文版就是默认用的GBK
  • ②UTF-8 / utf8,属于变长编码,表示一个符号,使用的字节数有变化;在utf8中,一个汉字一般是3个字节

我们可以在Windows本地和Linux中验证一下:

下面是Linux中的执行结果:

#include<iostream>
#include<string.h>int main()
{const char* s = "好";std::cout << strlen(s) << std::endl;
}

下面是在Windows上的测试结果: 

3.2 解决乱码问题

我们在析构函数中打印中文,那么这个代码的编码方式就是和主体文件直接相关的

  • Qt Creator 内置的终端不一定是 utf8 的方式来显示字符串,并且好像也不能设置字符编码,但是既然出现了乱码,那么肯定不是 UTF-8
  • 当前表示中文的主流方式还得是 UTF-8,因为不仅支持中文,很多其它国家文字都可以支持

但是不用担心,我们之前也说过,QString 是可以帮我们自动处理编码问题的;而且不止QString,Qt 也提供了专门用来打印日志的工具,也能自动处理编码问题

 并且 qDebug 还可以通过编译开关,实现一键式关闭

四,认识Qt坐标系

以左上角为原点(0,0),X往右增加,Y向下增加:

给Qt某个控件设置位置,就要指定坐标,坐标系原点就是相对于父窗口/控件的

  • move表示把控件移动到具体位置,单位是像素点
  • x和y函数就是获得该控件相对与原点(0, 0),的横坐标和纵坐标

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* b1 = new QPushButton("按钮1", this);QPushButton* b2 = new QPushButton("按钮2", this);b1->move(300, 200); //设置按钮1的坐标this->move(0, 100); //这个就是设置窗口的坐标,原点为我们屏幕的左上角qDebug() << "按钮1的坐标为:[" << b1->x() << ", " << b1->y() << "]";qDebug() << "按钮2的坐标为:[" << b2->x() << ", " << b2->y() << "]";
}Widget::~Widget()
{delete ui;
}

 

五,周边

5.1 命名规范

  • 类名:首字母大写,单词和单词之间的首字母大写,比如QApplication
  • 函数和变量名:首字母小写,单词和单词之间首字母大写,比如studentCount
  • Qt偏好驼峰命名法,这一点和之前的C++代码有区别,我们之前是喜欢这样的:unordered_map,priority_queue,这叫做蛇形命名法

5.2 快捷键

  • 注释:ctrl + /
  • 运行:ctrl + R
  • 编译:ctrl + B
  • 字体缩放:ctrl + 鼠标滚轮
  • 查找:ctrl + F
  • 整行移动:ctrl + shift + 上下箭头
  • 帮助文档:F1
  • 自动对齐:ctrl + i
  • 同名之间.h 和 .cpp 切换:F4
  • 生成函数声明的对应定义:alt + Enter

5.3 如何使用帮助文档

  • 可以将鼠标光标放到要查询的类名/方法名上,直接按F1
  • Qt Creator 左边侧栏中直接点击“帮助”按钮可以直接跳转
  • 第三种方式就是在开始菜单找到帮助文档,之前已经介绍过

相关文章:

QT跨平台应用程序开发框架(2)—— 初识QT

目录 一&#xff0c;创建helloworld 1.1 通过图形化 1.2 通过代码 1.3 通过编辑框 1.4 使用按钮 二&#xff0c;对象树 2.1 关于对象树 2.2 演示释放流程 三&#xff0c;乱码问题 3.1 为什么会有乱码问题 3.2 解决乱码问题 四&#xff0c;认识Qt坐标系 五&#xf…...

[创业之路-248]:《华为流程变革:责权利梳理与流程体系建设》华为流程的前端拉动后端,与计算机软件的前端应用与后端程序的类比关系

华为的前端拉动后端模式与计算机前端应用与后端程序的类比关系&#xff0c;虽然两者属于不同的领域&#xff0c;但在某些方面存在有趣的相似性。以下是对这两者的类比关系的详细探讨&#xff1a; 一、华为的前端拉动后端模式 定义与特点&#xff1a; 华为的前端拉动后端模式是…...

汇总统计数据--SQL中聚集函数的使用

目录 1、为什么需要汇总数据 2、聚集函数 &#xff08;1&#xff09;AVG函数 &#xff08;2&#xff09;COUNT函数 &#xff08;3&#xff09;MAX和MIN函数 &#xff08;4&#xff09;SUM函数 3、聚集不同值--DISTINCT 4、组合聚集函数 5、小结 博主用的是mysql8 DBMS…...

【C盘清理】C盘清理工具、Unity缓存文件转移

链接: https://pan.baidu.com/s/1yE_7qF741o4NmBIsrd3XzA?pwdbwnn CCleaner 用于清理磁盘垃圾 勾选你要分析的选项&#xff0c;点击分析&#xff0c;分析完毕后&#xff0c;点击清理。 主要别清错东西了。&#xff08;可以不要勾选网络缓存、网络记录相关的选项&#xff0…...

C# 迭代,递归,回调--13

目录 一.迭代 迭代器示例: 关键点: 优势: 二.递归 递归示例: 关键点: 优势: 注意: 三.回调 回调示例: 关键点: 优势: 应用场景: 4.三种模式的特点对比: 迭代: 递归: 回调: 一.迭代 在C#中迭代通常指重复执行一系列指令 在C#中,迭代器是一种特殊的结构,允许…...

海康大数据面试题及参考答案

请详细描述 YARN 提交程序的流程。 YARN(Yet Another Resource Negotiator)是一个资源管理系统,用于管理集群中的计算资源。以下是在 YARN 中提交程序的详细流程: 首先是客户端准备阶段。用户编写好应用程序,这个程序可以是 MapReduce、Spark 或者其他基于 YARN 的计算框架…...

软件测试 —— 自动化测试(Selenium)

软件测试 —— 自动化测试&#xff08;Selenium&#xff09; 什么是SeleniumPython安装Selenium1.安装webdirver-manager2.安装Selenium 写一个简单用例CSS_SELECTOR和XPATH浏览器快速定位页面元素浏览器的前进&#xff08;forward&#xff09;&#xff0c;后退&#xff08;bac…...

华为2024嵌入式研发面试题

01 你认为最好的排序算法是什么&#xff1f; 在实际的编程中&#xff0c;最好的排序算法要根据实际需求和数据规模来选择&#xff0c;因为每种排序算法都有其优势和劣势。以下是一些常见排序算法及其优缺点&#xff1a; 冒泡排序 冒泡排序是一种简单直观的排序算法&#xff0…...

centos 搭建nginx+配置域名+windows访问

准备工作&#xff1a;一个完整的centos环境&#xff0c;nginx安装包(可以从官网下载)nginx: download 一&#xff1a;centos可能有精简版&#xff0c;部分环境没有相关依赖包&#xff0c; 需要检查以下项&#xff1a; 1.gcc检查&#xff1a;gcc -v&#xff08;回车后应当有版…...

APP推荐:全新TV端来了,8K原画电视版

▌ 软件介绍 B站都不陌生吧&#xff0c;一个能追番、学习、娱乐的多元平台&#xff0c;之前也分享过几款第三方TV端&#xff0c;其中的BV最近更新了全新版本。 使用了全新的UI界面&#xff0c;由之前的顶部菜单栏改成了侧边布局&#xff0c;已解锁限制&…...

【MySQL】索引(一)

索引 一、磁盘1、物理结构2、示意图3、定位扇区4、读写操作的基本方式 二、页1、介绍2、示例3、作用与结构4、类型&#xff08;1&#xff09;数据页&#xff08;2&#xff09;其他 5、组织与管理6、性能优化7、示意图&#xff08;B树&#xff09; 三、索引1、作用2、注意事项 四…...

ES6的高阶语法特性

一、模板字符串的高级用法 1.1.模板字符串的嵌套 模板字符串的嵌套允许在一个模板字符串内部再嵌入一个或多个模板字符串。这种嵌套结构在处理复杂数据结构或生成具有层级关系的文本时非常有用。 1. 嵌套示例 假设我们有一个包含多个对象的数组&#xff0c;每个对象都有名称、…...

GO:GO程序如何处理缓存加载和大数据缓存

如果我们会在程序启动时&#xff0c;需要加载所有数据&#xff0c;最简单的方式就是程序启动&#xff0c;通过轮训从数据库拉取所有数据&#xff0c;并写入到本地缓存中。 问题&#xff1a;数据量较大的时候&#xff0c;程序加载慢&#xff0c;启动时间长&#xff0c;遇到问题不…...

时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级

近日&#xff0c;TDengine 3.3.5.0 版本正式发布&#xff0c;带来了多项重磅更新与优化&#xff0c;从功能拓展到性能提升&#xff0c;再到用户体验进行了全面改进。本次更新围绕用户核心需求展开&#xff0c;涵盖了开发工具、数据管理、安全性、可视化等多个层面&#xff0c;为…...

信息系统项目管理-采购管理-采购清单示例

序号类别产品/服务名称规格/功能描述数量备注1硬件服务器高性能处理器&#xff0c;大容量存储10HP、DELL2网络设备高速路由器和交换机10华为3工作站多核处理器&#xff0c;高分辨率显示器25国产设备4移动检查设备手持式移动检查仪&#xff0c;可连接云平台30国产设备5打印机和扫…...

python识别图片中指定颜色的图案并保存为图片

示例代码&#xff1a; def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…...

【git命令行】git pull冲突如何使用stash暂存,不提交当前工作的情况下临时保存修改

1、git add . 暂存区暂存 2、git stash save "message" 保存当前工作目录的临时状态&#xff0c;并将其存储为一个新的stash 3 、git pull 重新拉取 4、**git stash pop**吐出之前暂存的改动&#xff0c;git stash clear 清空所有暂存...

浏览器输入http形式网址后自动跳转https解决方法

一、问题描述 使用浏览器 网上冲浪 时会遇到一个情况&#xff1a; 在浏览器中输入“http域名”后会自动变成“https 域名”的形式&#xff0c;此时“https 域名”的网站可能已停止对外提供服务了&#xff0c;这时会出现如下不友好的网页提示&#xff1a; 二、处理方法&#x…...

BertTokenizerFast 和 BertTokenizer 的区别

BertTokenizerFast 和 BertTokenizer 都是用于对文本进行标记化的工具&#xff0c;主要用于处理和输入文本数据以供 BERT 模型使用。它们都属于 HuggingFace 的 transformers 库。 主要区别 底层实现&#xff1a; BertTokenizer: 这是一个使用纯 Python 实现的标记器&#xff…...

【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录前言 &#x1f343;一、实体对象更新1.1 单条与批量1.2 不更新某列1.3 只更新某列1.4 NULL列不更新1.5 无主键/指定列…...

思尔芯携手Andes晶心科技,加速先进RISC-V 芯片开发

在RISC-V生态快速发展和应用场景不断拓展的背景下&#xff0c;芯片设计正面临前所未有的复杂度挑战。近日&#xff0c;RISC-V处理器核领先厂商Andes晶心科技与思尔芯&#xff08;S2C&#xff09;达成重要合作&#xff0c;其双核单集群AX45MPV处理器已在思尔芯最新一代原型验证系…...

C++中const关键字详解:不同情况下的使用方式

在 C 中&#xff0c;const 关键字用于指定一个对象或变量是常量&#xff0c;意味着它的值在初始化之后不能被修改。下面详细介绍 const 修饰变量、指针、类对象和类中成员函数的区别以及注意事项。 修饰变量 详细介绍 当 const 修饰变量时&#xff0c;该变量成为常量&#x…...

Python爬虫实战:研究urlunparse函数相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上的数据量呈现出指数级增长。如何从海量的网页数据中高效地获取有价值的信息,成为了学术界和工业界共同关注的问题。网络爬虫作为一种自动获取网页内容的技术,能够按照预定的规则遍历互联网上的网页,并提取出所需…...

SON.stringify()和JSON.parse()之间的转换

1.JSON.stringify() 作用&#xff1a;将对象、数组转换成字符串 const obj {code: "500",message: "出错了", }; const jsonString JSON.stringify(obj); console.log(jsonString);//"{"code":"Mark Lee","message"…...

npm run dev 报错:Error: error:0308010C:digital envelope routines::unsupported

npm run dev时报错如下 原因&#xff1a;更换node版本导致 解决&#xff1a; 修改package.json文件&#xff0c;在相关构建命令之前加入 SET NODE_OPTIONS–openssl-legacy-provider 运行成功...

软考 系统架构设计师系列知识点之杂项集萃(84)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;83&#xff09; 第151题 在软件系统工具中&#xff0c;版本控制工具属于&#xff08;&#xff09;&#xff0c;软件评价工具属于&#xff08;&#xff09;。 第1空 A. 软件开发工具 B. 软件维…...

Webhook 配置备忘

本文地址&#xff1a;blog.lucien.ink/archives/552 将下列代码保存为 install.sh&#xff0c;然后 bash install.sh。 #!/usr/bin/env bash set -e wget https://github.mirrors.lucien.ink/https://github.com/adnanh/webhook/releases/download/2.8.2/webhook-linux-amd64.…...

动手学深度学习12.7. 参数服务器-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;35 分布式训练【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;12.7. 参数服务器…...

智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学

目录 引言 一、初识蓝耘元生代MaaS平台 1.1 平台架构 1.2 平台的优势 1.3 应用场景 二、手把手教你如何在蓝耘进行注册 &#xff08;1&#xff09;输入手机号&#xff0c;将验证码正确填入即可快速完成注册 &#xff08;2&#xff09;进入下面的页面表示已经成功注册&…...

用OpenNI2获取奥比中光Astra Pro输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro&#xff0c;想在windows平台&#xff0c;和linux rk3588 &#xff08;香橙派&#xff0c;ubuntu2404,debian)上获取深度信息&#xff0c;之前的驱动下载已经不好用了,参考如下 Astra 3D相机选型建议 - 知乎https://zhuanlan.zhihu.com/p/594485674 …...