Qt简单使用与初识

news2024/11/16 11:54:38

🌇个人主页:平凡的小苏
📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘
🛸qt学习专栏qt学习专栏
> 家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我真重要,各位路 过的友友麻烦多多点赞关注。 欢迎你们的私信提问,感谢你们的转发! 关注我,关注我,关注我,你们将会看到更多的优质内容!!

在这里插入图片描述

一 、Qt HelloWorld程序

1、纯代码”按钮“实现

实现按钮的来回切换代码

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    mybutton = new QPushButton(this);
    mybutton->setText("Hello World");
    connect(mybutton,&QPushButton::clicked,this,&Widget::handleClick);
}

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

void Widget::handleClick()
{
    //当按钮点击之后,就把按钮中的文本进行切换
    if(mybutton->text() == QString("Hello World")){
        mybutton->setText("hello qt!!!");
    }else{
        mybutton->setText("Hello World");
    }
}

image-20240119124441876

对于纯代码版本,按钮对象是咱们总结new的。

为了保证其他函数中能够访问到这个变量,就需要把按钮对象,设定为Widget类的成员变量。

2、可视化方式操作

image-20240119180347800

(2)拖拽控件⾄ ui 界⾯窗⼝并修改内容;

image-20240119180332742

按钮操作实际就是让生成的框框可以进行点击操作,可是我们点击之后没有反应。

这时候就需要用到信号和槽机制,connect().

Linux网络编程中,也有一个connect,这个函数是用来给TCP socket建立连接的。

而Qt中的connect是QObject这个类提供的静态函数,这个函数的作用就是”连接信号和槽“

image-20240119121752823

在QtDesignenr中创建一个控件的时候,此时就会给这个课件分配一个objectName属性

这个属性的值,要求是在界面中是唯一的(不能和别人重复)

image-20240119121958621

connect的第一个参数表示:谁发出的信号

connect的第二个参数表示:发出了什么信号,点击按钮的时候就会自动触发这个信号

connect的第四个参数表示:谁来处理这个信号,具体怎么处理

第四个参数的实现代码:实现两个按钮来回切换

void Widget::handleClick()
{
    //当按钮点击之后,就把按钮中的文本进行切换
    if(ui->pushButton->text() == QString("Hello World")){
        ui->pushButton->setText("hello qt!!!");
    }else{
        ui->pushButton->setText("Hello World");
    }
}

此时按钮对象,不需要咱们自己new,new对象的操作已经是被Qt自动生成了。

而且这个按钮对象,已经作为ui对象里的一个成员变量了,也无需作为Widget的成员

3、纯代码”标签“实现

image-20240119180318916

二、对象初识

在 Qt 中创建很多对象的时候会提供⼀个 Parent 对象指针,下⾯来解释这个 parent 到底是⼲什么的。

• QObject 是以对象树的形式组织起来的。

  • 当创建⼀个 QObject 对象时,会看到 QObject 的构造函数接收⼀个 QObject 指针作为参数,这个参数就是 parent,也就是⽗对象指针。

  • 这相当于,在创建 QObject 对象时,可以提供⼀个其⽗对象,我们创建的这个 QObject 对象会⾃动添加到其⽗对象的 children() 列表。

  • 当⽗对象析构的时候,这个列表中的所有对象也会被析构。(注意,这⾥的⽗对象并不是继承意义上的⽗类!)

这种机制在 GUI 程序设计中相当有⽤。例如,⼀个按钮有⼀个 QShortcut(快捷键)对象作为其⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。

• QWidget 是能够在屏幕上显⽰的⼀切组件的⽗类。

  • QWidget 继承⾃ QObject ,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如,当⽤⼾关闭⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。

  • 当然,我们也可以⾃⼰删除⼦对象,它们会⾃动从其⽗对象列表中删除。⽐如,当我们删除了⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕显⽰。

Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。

• 当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

• 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。Qt 保证没有 QObject 会被delete 两次,这是由析构顺序决定的。

如果 QObject 在栈上创建,Qt 保持同样的⾏为。正常情况下,这也不会发⽣什么问题。来看下⾯的代码⽚段:

image-20240119180308877

image-20240119180300058

这时程序就没有打印出中华人民共和国万岁,这是因为创建完栈对象,然后就跳出作用域,就就行析构了。

而不是根据程序的结束才进行析构的。虽然没有出错,但是没有得到我们想要的结果。

1、对象树的构建与析构

image-20240119180415067

image-20240119180430144

这里运行出来后,终端输出了中文乱码,其实就是编码不匹配

image-20240118192509959

解决方案

Qt中提供了一个qDebug()工具,根据这个,就可以完成打印日志的过程

qDebug() << "MyLabel 被销毁!";

这个宏,封装了QDebug这个对象,直接使用qDebug(),这个东西就可以当作cout来使用。

使用qDebug,还有一个好处,打印的调试日志,是可以统一进行关闭的!

输出的日志,是开发阶段的,调试程序的时候使用的。

如果你的程序发布给用户,是不希望用户看到这些日志的!

qDebug可以通过编译开关,来实现一键式关闭!

三、总结

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

通过setText来设置的,参数QString(Qt中把C++里的很多容器类进行了重新封装,历史原因)

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

3、对象树。Qt中通过对象树,来统一的释放界面的控件对象。

Qt还是推荐使用new的方式在堆上创建对象,通过对象树,统一释放对象。

创建对象的时候,在构造函数中,指定父对象(此时才会挂到对象树上)如果你的对象没有挂到对象上,就必须要记得手动释放!!

4、通过继承自Qt内置的类,就可以达到对现有控件进行功能扩展效果。Qt内置的QLabel,没法看到销毁的过程,为了看清楚,就创建类MyLabel,继承自QLabel重写析构函数。在析构函数中,加上日志,直观的观察到对象释放的过程了。

5、乱码问题和字符集

6、如何在Qt打印日志、作为调试信息。使用cout固然可以,但是字符编码处理的不好,也不方便进行统一关闭。Qt更推荐使用qDebug()

四、Qt的快捷键

• 注释:ctrl + /

• 运⾏:ctrl + R

• 编译:ctrl + B

• 字体缩放:ctrl + ⿏标滑轮

• 查找:ctrl + F

• 整⾏移动:ctrl + shift + ⬆/⬇

• 帮助⽂档:F1

• ⾃动对⻬:ctrl + i;

• 同名之间的 .h 和 .cpp 的切换:F4

• ⽣成函数声明的对应定义: alt + enter

五、Qt使用帮助文档

1、光标放到要查询的类名/⽅法名上, 直接按 F1

2、Qt Creator 左侧边栏中直接⽤⿏标单击 “帮助” 按钮:

3、找到 Qt Creator 的安装路径,在 “bin” ⽂件夹下找到 assistant.exe,双击打开;

六、Qt坐标系

坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加。

image-20240119175005672

设置控件位置的代码如下

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton* btn = new QPushButton(this);
    btn->setText("开始");
    btn->move(300,300);
}

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

image-20240119180231151

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

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

相关文章

vector迭代器的失效

1.vector的底层 vector的底层就是由三个指针构成的 iterator _start 这个指针指向vector数据起始位置。 iterator _finish这个指针指向vector数据的结束位置。 iterator _end_of_shorage这个指针指向vector容量的位置。 2.迭代器失效的种类 2.1扩容引发的迭代器失效 例&…

深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

Framework层之输入系统 第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 文章目录 Framework层之输入系统前言一、基础知识1、输入子系统2、INotify 与 Epoll2.1、INotify 机制…

redisson的延时队列机制简述

概述 业务中经常会遇到一些延迟执行的需求&#xff1b;通常想到的都是rabbitmq或者rocketmq的延迟消息&#xff1b; 但是系统中不一定集成了mq&#xff0c;但为了控制分布式下的并发&#xff0c;一般redis都是有集成的&#xff1b; redis的key过期监听那个时间不准确&#xff…

初识React,基础(1), 安装react,jsx文件,类组件和函数组件,css样式

第一部分:初识react react: 用于构建用户界面的 JavaScript 库全局安装,win r, 命令: npm install create-react-app -g3. 创建一个react应用, 这里我在vscode 里面创建, 创建之后,运行 create-react-app my-appcd my-app npm start 第二部分: redact 组件定义以及使用 rea…

视频增强修复Topaz Video AI

Topaz Video AI是一款强大的视频增强软件&#xff0c;利用人工智能技术对数千个视频进行训练&#xff0c;结合多个输入视频的帧信息来提高素材的分辨率。该软件可将视频的分辨率提高到最高8K&#xff0c;并保持真实的细节和运动一致性。同时&#xff0c;它还能自动修复视频中的…

NFS网络共享存储服务技术攻略

目录 一.NFS 1.定义 2.特点 3.原理 二.服务端NFS配置文件 1.主配置文件 2.文件格式 3.相关命令 三.实验&#xff1a;NFS共享存储服务配置 1.服务端安装nfs-utils和rpcbind软件包 2.服务端新建共享目录给权限 3.服务端修改配置文件/etc/exports 4.服务端关闭防火墙…

【C++干货铺】C++11常用新特性 | 列表初始化 | STL中的变化

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C11简介 列表初始化 std::initializer_list std::initializer_list使用场景 decltype关键字 STL中的一些变化 新容器 array forward_list 容器中的一些新…

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

ChatGPT提示词保姆级教程

现在越来越多提示词教程&#xff0c;本文列个清单&#xff0c;方便以后整理&#xff0c;不定期更新&#xff0c;欢迎关注留言&#xff01; 后续更新欢迎关注 提示词&#xff08;prompt&#xff09;出来后&#xff0c;被称为一个新的岗位诞生&#xff0c;面向提示词工程师。 …

将vue项目打包成桌面客户端实现点击桌面图标直接进入项目

1.下载NW.js 下载地址&#xff1a;NW.js官网 下载完后zip解压 2.文件夹下新建index.html index内容如下&#xff1a; <!DOCTYPE html> <html> <head> </head> <body> <script language"javascript" type"text/javascript&q…

《游戏-01_2D-开发》

首先利用安装好的Unity Hub创建一个unity 2D&#xff08;URP渲染管线&#xff09;项目 选择个人喜欢的操作格局&#xff08;这里采用2 by 3&#xff09; 在Project项目管理中将双栏改为单栏模式&#xff08;个人喜好&#xff09; 找到首选项&#xff08;Preferences&#xff09…

K8s知识点总结_part1

Kubernetes 是什么 为用户提供一个具有普遍意义的容器编排工具。 它着重解决的问题是&#xff1a;大规模集群中的各种运行任务之间的关系处理&#xff0c;这些关系的处理&#xff0c;是作业编排和管理系统最困难的地方。 其能力有&#xff1a; • 基于容器的应用部署、维护和…

C#编程-使用反射检索元数据

使用反射检索元数据 术语反射通常用来指镜像。如果您站在镜子面前,镜子会反射出您的所有物理属性,如:您的身高、肤色和身体结构。在C#中也一样,反射被用于反射程序有关的所有信息。C#程序可以利用反射获得类在运行时的信息。 反射在运行时获取类型信息的过程中被使用。提…

Python自动化报告的输出用例详解

1、设计简单的用例 2、设计用例 以TestBaiduLinks.py命名 # coding:utf-8from selenium import webdriverimport unittestclass BaiduLinks(unittest.TestCase):def setUp(self):base_url https://www.baidu.comself.driver webdriver.Chrome()self.driver.implicitly_wait(…

监控系统——Zabbix

目录 Zabbix概述 Zabbix 监控原理 Zabbix 与 Prometheus的区别 Zabbix 6.0 新特性 Zabbix 6.0 功能组件 Zabbix Server 数据库 Web 界面 Zabbix Agent Zabbix Proxy Java Gateway Zabbix 6.0 部署 部署 zabbix 服务端 添加 zabbix 客户端主机 自定义监控内容…

如何使用idm下载百度网盘的资源

IDM是海内外都非常受欢迎的一款下载管理软件。它支持视频媒体嗅探和多线程下载&#xff0c;能够完美替代谷歌Chrome浏览器、Edge浏览器等浏览器的原生下载功能。在浏览器中单击下载链接时&#xff0c;idm将接管浏览器的原生下载工具并加快下载速度&#xff0c;支持HTTP&#xf…

Architecture Lab:part A 【实现sum_list/rsum_list/copy_block/熟悉Y86-64指令】

Architecture Lab 对应CS:APP的Chap 4——处理器体系结构。Part A要实现三个函数&#xff0c;分别为sum_list/rsum_list/copy_block。建议先得到x86-64指令&#xff0c;然后再转换为Y86-64指令。 准备工作 在misc目录下&#xff0c;键入以下命令用来生成汇编代码。命令执行完…

tui.calender日历创建、删除、编辑事件、自定义样式

全是坑&#x1f573;&#xff01;全是坑&#x1f573;&#xff01;全是坑&#x1f573;&#xff01;能不用就不用&#xff01; 官方文档&#xff1a;https://github.com/nhn/tui.calendar/blob/main/docs/en/apis/calendar.md 实例的一些方法&#xff0c;比如创建、删除、修改、…

【React】脚手架创建项目

文章目录 创建React项目目录结构分析了解PWA脚手架中的webpack 创建React项目 ◼ 创建React项目的命令如下&#xff1a; ​  注意&#xff1a;项目名称不能包含大写字母 ​  另外还有更多创建项目的方式&#xff0c;可以参考GitHub的readme 命令&#xff1a; create-rea…

Redis相关命令详解及其原理

Redis概念 Redis&#xff0c;英文全称是remote dictionary service&#xff0c;也就是远程字典服务。这是kv存储数据库。Redis&#xff0c;包括所有的数据库&#xff0c;都是请求-回应模式&#xff0c;通俗来说就是数据库不会主动地要给前台推送数据&#xff0c;只有前台发送了…