QT --- 初识QT

一、通过代码构建helloworld界面

一般通过代码来构造界面的时候,通常会把构造界面的代码放到Widget/MainWindow的构造函数中。

Qt中每个类都有对应同名的头文件

上古时期,Qt用的是这种风格的文件。1998年之后,C++标准成立了,C++98标准。规定,包含头文件,统一使用#include<cstdio>代替原有的#include<stdio.h>

Lable叫做标签,界面上一个用来显示内容字符串的控件,创建对象的时候,可以直接堆上创建,也可以在栈上创建。跟推荐在堆上创建对象。


this,给当前这个label对象,指定一个"父对象" this 就是Widget w。给这个对象里面设置一个文本,设置控件中,要显示的文本是啥。

Qt诞生于1991年,C++还没有形成标准,C++更没有标准库这样的改变了。当时,如何表示一个字符串,可以使用C风格字符串,也可以使用C++的string。Qt为了让自己的开发能变得的顺畅,就自己发明了一套轮子,搞了一系列的基础类,来支持Qt的开发,

很多年之后,上述这些容器等内容,已经打磨的很好了,形成了C++标准。

很显然,这些已经引入的Qt自己包装好的这些容器类,也不可能删了。就只能和现有的标准库中的容器类共存了。后续的代码中,还会经常见到QString这样的一些东西,而很少见到std::string Qstring和std::string之间也能很方便的相互转换。

在QString中也提供了C风格字符串作为参数的构造函数,不显示构造QString,上述代码中,C风格字符串也会隐式构造程QString对象。QString对应的头文件,已经被很多Qt内置的其他类都包含了。所以我们不需要显式包含QString头文件。通过代码创建QLable默认式在左上角。如果想放到其他的位置,也是可以的。

代码:

二、内存泄露问题的讨论。

这个代码,new了对象之后,咋没有delete呢?不delete不就出现内存泄露了吗?

关注内存泄漏,是要融入到DNA中的事情,内存泄露是一个非常可怕的事情。

三、对象树

上面的代码在QT中不会产生内存泄漏,lable对象会适合的时候被析构释放 ~~ 虽然没有手动写delete,确实能释放。之所以能够把对象释放掉,主要是因为把这个对象挂到了对象树上。前端开发也涉及到了类似的对象树(DOM),本质上也是一个树形结构(N叉树),通过树形结构把界面上的各种元素组织起来。Qt中也有一个对象书树也是N叉树,把界面上的各种元素组织起来了。

通过这个树形结构,就把界面上要显示的这些控件对象都组织起来了。使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机,把这些对象统一进行释放。

如果树上的这些对象,统一销毁时最好不过的,如果某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了。此处通过new的方式创建对象,也就是为了把这个对象生命周期,交给Qt的对象树来统一管理。

当把对象改成在栈上创建,此时就可以看到,运行起来的程序无法显示出hello world此时lable对象随着构造函数的结束就销毁了。

我们来验证一下对象树的存在性。可以用自己编写的类来实现验证。创建自定义类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印,方便我们看到最终的自动销毁对象的结果!!

#include <QLabel>
class MyLable : public QLabel
{
public:MyLable(QWidget* parent);~MyLable();
};#endif // MYLABLE_H
#include "mylable.h"
#include <iostream>
MyLable::MyLable(QWidget* parent):QLabel(parent)
{}MyLable::~MyLable()
{std::cout << "对象被销毁" << std::endl;
}

日志有:说明析构函数是执行了,虽然没有手动delete,但是由于把MyLable挂到了对象树上。此时窗口被销毁的时候,就会自动销毁对象树中的所有对象。MyLable的析构时执行到了的。

预期打印的时被销毁三个中文,但是实际的显示效果,出现了乱码。原因就是编码方式不匹配。

关于乱码问题的解释:

在计算机中,一个汉字,占多少个字节?

针对这个问题,只要你回答出具体的数字,就一定时错的!。前提条件:当前中文编码使用的是哪种方式(字符集)。计算机种存储的都是二进制码。英文字母是通过ASCII码表,规定了每个字符,都有一个对应的数字来表示。只是表示英文,一个字节足够了,毕竟英文字母数目非常有限。

中文一共多少个汉字呢?日常的常用字,大概是4000多个。算上各种生僻字,总数差不多6W多个。我们仍然使用一个大表格,给每个汉字,分配一个整数即可。那么具体这个表格是什么样子。具体每个数字都使用哪个数字表示这个事情就不一定了,字符集表示汉字的字符集,其实是有很多种的不同的字符集,表示同一个汉字,使用的数字并不相同!

目前表示汉字字符集,主要两种方式

1、GBK中国大陆 使用2个字节表示一个汉字。

2、UTF-8变长编码,表示一个符号,使用的字节数有变化。2 - 4字节,但是在utf-8中,一个汉字,一般是3个字节。Linux中默认就是utf-8。

如果你字符串本身是utf-8编码的,但是终端是按照GBK的方式解析的显示的,此时就会出现乱码,(拿着utf-8这里的数值,去查询gbk的码表)此时就会出现乱码了。

Qt Creator内置的终端是utf-8的方式来显示字符串吗?

这个终端好像不能设置字符编码,既然出现乱码了,这里不是utf-8了。当前表示中文,主流的方式,还得是utf-8,它支持各种语言文字。Qt中有一个东西,QString,是可以帮助我们自动的处理编码方式的,不只是QString,Qt也提供了专门用来打印日志的工具,也能自动处理编码方式。Qt中提供了QDebug工具,借助这个工具,就可以完成打印日志的过程,很好的处理字符编码了。

 QDebug是Qt中的类,又不会直接使用这个类。

这个宏,封装了QDebug对象,直接使用qDebug()这个东西就可以当作cout来使用。后续在Qt中,如果想通过打印日志的方式,输出一些调试信息,都有限使用qDebug,使用qDebug还有一个好处,打印的调试日志,是可以统一进行关闭的。如果你的程序发布给用户,不希望用户看到这些日志的!qDebug可以通过编译开关,来实现一键式关闭。

小结:

1、认识了QLabel类,能够在界面上显示字符串。

       通过setText来设置的,参数QString。这是一个历史原因

2、内存泄漏/文件资源泄漏。

3、对象树,Qt中通过对象树,来统一的释放界面的控件对象。Qt还是推荐使用new的方式在堆上创建对象,通过对象树,统一释放资源。创建对象的时候,在构造函数中,指定父对象此时才会挂到对象树上。如果你的对象没有挂到对象树上,就必须记得手动释放。

4、通过继承自Qt内置的类,就可以达到对现有控件进行功能扩展的效果。Qt内置的QLabel,没法看到销毁过程,为了看清楚我们就创建类MyLable,继承QLabel重写析构函数。在析构函数,加上日志,直观的观察到对象释放的过程了。也可以重写控件中的任何功能,不仅仅是构造,达到功能扩展的目的,面向对象继承本质上就对现有的代码进行扩展。我们要学习,也要思考需要悟道。

5、乱码问题和字符集的问题。在MySQL中很多地方都涉及到。

6、如何在Qt中打印日志,作为调试信息。使用Qt中推荐的qDebug()完成日志的打印。

四、使用输入框实现helloworld

完成一个helloworld可以通过很多种控件来实现。

使用编辑框来完成hello world

单行编辑框 QLineEdit

多行编辑框 QTextEdit

代码:

使用纯代码的方式实现:

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

五、使用按钮实现helloworld

使用pushbutton就是一个普通的按钮。按钮可以设置一个点击效果。Qt中的信号槽机制。本质就是给按钮的点击操作关联上一个处理函数,当用户点击的时候,就会执行这个处理函数。、

需要使用connect(),Linux网络编程也学过这个函数,这个函数用来建立连接,然后才能读写数据。Qt中的connect是QObject这个类提供的静态函数,这个函数的作用就是连接信号和槽。和TCP的建立连接操作没有任何的关系。第一个参数谁发的信号,ui->pushbutton,访问到form file(ui文件)中创建的控件!此时就会给这个控件分配一个objectName属性。这个属性的值,要求是在界面上唯一的。不能和别人重复。会自动生成一个,也可以手动修改换成别的。

第二个参数传入,关联到父类中,然后

点击按钮的时候就会自动触发这个信号。

this 谁来处理这个信号,第四个参数具体怎么处理。

代码:

#include "ui_widget.h"
#include <QObject>
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() == "hello world")ui->pushButton->setText("hello qt");elseui->pushButton->setText("hello world");
}

使用纯代码的方式实现。

#include "widget.h"
#include "ui_widget.h"
#include<QObject>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使用纯代码的方式实现helloworld,信号槽机制//button我们定义为了Widget类中的私有成员。button = new QPushButton(this);button->setText("helloworld");connect(button,&QPushButton::clicked,this,&Widget::Handler);}Widget::~Widget()
{delete ui;
}void Widget::Handler()
{if(button->text() == "helloworld"){button->setText("hello qt");}else{button->setText("helloworld");}
}

 左边为纯代码创建,右边为ui创建

对于纯代码版本,按钮对象是咱们自己new的。为了保证其他函数中能够访问这个变量,就需要把按钮对象设定为Widget类的成员变量。右边的按钮对象不需要咱们自己new,new对象的操作已经被Qt自动生成了。而且这个按钮对象,已经作为ui对象里的一个成员变量了。也无需作为Widget的成员。实际开发中,这两种都很主要,难分主次!如果当前程序界面,界面内容是比较固定的,此时就会以图形化的方式来构造界面。但是如果你的程序界面,经常要动态变化,此时就会以代码的方式来构造界面。这两种方式,哪种方便就用哪种。而且两种方式也可以配合使用,后面这两种方式都会涉及到。

六、Qt中的命名规范

给变量/函数/文件/类 起名字,是非常有讲究的。

1、起的名字要有描述性,不要使用abc,xyz这种比较无规律的名字来描述。

2、如果名字比较长,有多个单词构成,就需要使用适当的方式来进行区分不同的单词。Qt中偏好使用大写字母来进行单词分割的。这种命名法叫做驼峰命名法。一种是小驼峰给变量命名,一种是大驼峰给类命名。我们入乡随俗。你公司中使用的项目,使用的驼峰/蛇形/其他。

七、认识Qt窗口坐标体系

坐标体系:以左上角为原点(0,0),右边为x,向下为y。平面直角坐标系(笛卡尔坐标系)

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

 代码:

#include "widget.h"
#include "ui_widget.h"
#include<QObject>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使用纯代码的方式实现helloworld,信号槽机制//button我们定义为了Widget类中的私有成员。button = new QPushButton(this);button->setText("helloworld");connect(button,&QPushButton::clicked,this,&Widget::Handler);button->move(200,300);}

可以使用move这个函数来移动控件的位置。坐标背后的单位:像素。 

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

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

相关文章

jenkins入门

CI 、CD入门 一:jenkins实现CI操作 1.在jenkins环境安装jdk 、maven ,同事修改maven里的settings.xml中的两个配置:添加jdk插件版本并开启和私服镜像(也可以在jenkins页面的全局配置选择自动安装,但是自动安装速度很慢,所以这里选择手动安装,后面直接在全局配置指定目…

太阳下山还有月光,月亮睡了还有朝阳

最近听到一首歌《GooGoo-不要慌太阳下山有月光》&#xff0c;觉得里面的歌词很有意思&#xff0c;这也是标题的由来。截取歌词片段&#xff1a; 不要迷茫 不要慌张 太阳下山 还有月光 它会把人生路照亮 陪你到想去的地方 不要彷徨 不要沮丧 月亮睡了 还有朝阳 抬头看天一定会亮…

如何正确使用MMPI量表进行测试?

1、需要初中以上学历&#xff0c;能对测试题准确的理解。 2、应在安静、无干扰的环境中进行&#xff0c;确保自己能够集中注意力完成测试。 3、尽量不要选择“无法回答”这个选项&#xff0c;当然如果确实有无法回答的&#xff0c;也可以选&#xff0c;但是总数不要超过22个。…

Python计算机视觉 第9章-图像分割

Python计算机视觉 第9章-图像分割 图像分割是将一幅图像分割成有意义区域的过程。区域可以是图像的前景与背景或图像中一些单独的对象。这些区域可以利用一些诸如颜色、边界或近邻相似性等特征进行构建。 9.1 图割&#xff08;Graph Cut&#xff09; 图割&#xff08;Graph…

一步一步自制py脚本并且并且修改为exe可执行文件教学外附带SHA-1解密exe文件资源

第一步&#xff1a;安装 Python 下载 Python&#xff1a;访问 Python 官网 下载并安装最新版本的 Python。安装时选择添加到环境变量 PATH&#xff1a;在安装过程中&#xff0c;确保勾选“Add Python to PATH”选项。 第二步&#xff1a;编写 Python 脚本 创建一个新的 Pyth…

基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制

关联比赛: 2021第二届云原生编程挑战赛2&#xff1a;实现一个柔性集群调度机制 参赛心得 历时快两个月的第二届云原生编程挑战赛结束了&#xff0c;作为第一次参赛的萌新&#xff0c;拿下了28名的成绩&#xff0c;与第一名差了19万分&#xff0c;因为赛制时间太长&#xff0c…

基于python+django+vue的社区爱心养老管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

103.WEB渗透测试-信息收集-FOFA语法(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;102.WEB渗透测试-信息收集-FOFA语法&#xff08;2&#xff09; FOFA使用实例 组件框架 …

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key&#xff0c;也就是defaultZone不支持snake-c…

cmd命令

常用命令 查看电脑名称&#xff1a; hostname 查看网卡信息&#xff1a; ipconfig 快速打开网络设置界面&#xff1a; control.exe netconnections 或 rundll32.exe shell32.dll,Control_RunDLL ncpa.cpld 打开防火墙设置&#xff1a; wf.msc 指定网卡设置IP地址&#…

Vue:使用v-model绑定的textarea在光标处插入指定文本

一、问题描述 使用v-model绑定的textarea如果需要改变其内容&#xff0c;一般只要改变v-model对应的变量即可&#xff0c;但如果需要在textarea的当前光标位置插入指定文本&#xff0c;那就需要操作DOM了。于是我们写了一段js&#xff1a; const insertTextAtCursor (text) …

基于TCP发送北斗消息给船舶设备终端

文章目录 引言I 自定义动态数据交换协议信息交换接口通信格式消息发送指令状态码错误信息返回指令II Netty实现TCP客户端III Java 原始API实现TCP客户端知识扩展: 基于Netty的定位数据平台通信协议定位方式移动定位设备see also引言 需求:发送北斗消息给船舶设备终端 动态信…

windows安装docker、elasticsearch、kibana、cerebro、logstash

文章目录 1. 安装docker1.1. 两大要点1.1.1. 安装启用hyper-v电脑不存在hyper-v的情况 1.1.2. 下载安装docker 2. 在docker里面安装elasticSearch&#xff0c;kibana&#xff0c;cerebro3. 安装logstash-将数据导入到elasticSearch3.1 安装logstash3.1.1 注意事项3.1.1.1. 等了…

【VSCode】VSCode Background 背景插件辅助窗口程序

前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项&#xff0c;这…

从汇编语言到高级语言:人类计算机科学的伟大探索

从20世纪中叶第一台电子计算机的诞生&#xff0c;到如今的智能设备遍布全球&#xff0c;计算机科学的发展历程是一部充满着人类探索精神的伟大史诗。计算机语言作为人类与机器交流的桥梁&#xff0c;见证并推动了这一切。从最早的汇编语言到如今多样的高级语言&#xff0c;我们…

基于python+django+vue的鲜花商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…

Acrobat XI 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

AI论文写作测评!类似茅茅虫论文写作助手网站

在当前的学术研究和写作环境中&#xff0c;AI论文写作助手成为了许多学者和学生的重要工具。其中&#xff0c;千笔-AIPassPaper和茅茅虫论文写作助手是两款备受关注的平台。本文将对这两款工具进行详细测评&#xff0c;并推荐适合不同需求的用户使用。 千笔-AIPassPaper AI论文…

2024/9/15 408“回头看”之应用层小总结(下)

域名系统DNS: 本地域名服务器 本地域名服务器起着代理的作用&#xff0c;会将报文转发到根域名服务器、顶级域名服务器、权限域名服务器。 递归查询&#xff1a; 迭代查询&#xff1a; 文件传送协议FTP: FTP客户和FTP服务器之间使用的是tcp连接。 控制连接使用21端口&…