【Qt】初识Qt(二)

目录

  • 一、显示hello world
    • 1.1 图形化界面
    • 1.2 写代码
  • 二、对象树
  • 三、使用输入框显示hello world
  • 四、使用按钮显示hello world

一、显示hello world

有两种方式实现hello world:

  • 通过图形化界面,在界面上创建出一个控件,显示hello world
  • 通过写代码的方式,创建控件,显示hello world

1.1 图形化界面

点击widget.ui文件,进入界面设计。左边找到Label标签,鼠标点中拖到框框里面,然后写hello world
在这里插入图片描述
注意:框框里面写了hello world后,在source文件夹的main.cpp和widget.cpp文件内容是没有变化的,变化的是.ui文件

在这里插入图片描述
点击左下角的三角形按钮,运行:
在这里插入图片描述

同时在右上角发现,多了一个控件:
在这里插入图片描述

刚刚我们写了hello world的内容,ui文件就会在xml中多出来一段代码,qmake就会在编译项目的时候,基于这段代码生成一段C++代码,然后通过这段C++代码构建出界面内容(这是自动完成的,不需要手动)

1.2 写代码

写代码的位置:在widget.cpp文件中

#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);// QLabel label;label->setText("hello world");
}Widget::~Widget()
{delete ui;
}
  • 注意要记得带上头文件#include < QLabel>
  • QLabel可以在对堆上创建对象,也可以在栈上创建对象,一般用堆更好些
  • QLabel对象的小括号中的this表示指明父类(Widget w)
  • 对象的方法的setText填入要显示的文本内容,可以直接用C风格字符串(C格式字符串会隐式构造成QString对象)

由于Qt出现的比较早,当时还没有C++的标准库,所以Qt为了自己的开发能够流畅,也有自己的一套轮子,包括:字符串QString、QVector、QList、QMap等等。但是现在QString和std::string是可以相互转换的,相比而言,QString稍微好点,因为它内部的已经对于字符编码做了处理。

运行:
在这里插入图片描述

二、对象树

上面的代码有一些“问题”,在C++中,我们写代码new出来的对象最后都要释放,否则会内存泄漏,可是这里的代码并没有显示去释放它。

其实在Qt中,不会产生内存泄漏问题,label对象会在合适的时候被析构释放,之所以能够被释放,是因为这个对象被挂到了对象树上(与参数的this有关)

这个对象树是一个N叉树,会把界面上的各种元素(控件对象)组织起来,然后统一进行释放,合适的时候:窗口关闭

前面说通过new更好,是为了把这个对象的生命周期交给Qt的对象树进行管理,如果是栈就不行了,可能存在提起释放问题(出了作用域对象就销毁了,导致最后要显示的内容没有显示出来)

验证堆上能够自动释放:
这里我们自定义一个MyLabel类,只要MyLabel类的析构函数执行到了,此时窗口就会销毁,自动把对象树上的所有对象销毁

mylabel.h文件:

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{
public:// 构造函数使用QWidget*版本的// 这样才能确保对象加到对象树上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已销毁" << 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 *mylabel = new MyLabel(this);mylabel->setText("hello world");
}Widget::~Widget()
{delete ui;
}

运行:在这里插入图片描述
出现了乱码问题。

解决方法:使用Qt提供的qDebug() 工具,可以完成日志打印工作,处理好编码格式问题

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

运行:
在这里插入图片描述
后续尽量使用qDebug 来打印输出信息

三、使用输入框显示hello world

使用单行编辑框 QLineEdit 完成

两种方式:界面和代码

在这里插入图片描述

代码:

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

在这里插入图片描述

四、使用按钮显示hello world

在这里插入图片描述
按钮是可以点击的,但是需要Qt中的信号槽机制。本质是给按钮的点击操作设置一个处理函数,当点击时,就会执行这个处理函数

代码:

#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::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{// 当按钮被点击时,就把按钮的内容进行替换if(ui->pushButton->text() == QString("hello world")){ui->pushButton->setText("hello qt");}else {ui->pushButton->setText("hello world");}
}

connect函数:

  • ui->pushButton:谁发出信号
  • &QPushButton::clicked:发出什么信号,点击按钮就会触发这个信号
  • &Widget::handleClick:处理函数

别忘了在widget.h文件声明处理函数:
在这里插入图片描述
运行,点击按钮,内容从hello world变成hello qt,再点击,从hello qt变成hello world

在这里插入图片描述

在这里插入图片描述

下面用代码的方式来实现按钮显示hello world

代码:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myp = new QPushButton(this);myp->setText("hello world");connect(myp, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{// 当按钮被点击时,就把按钮的内容进行替换if(myp->text() == QString("hello world")){myp->setText("hello qt");}else {myp->setText("hello world");}
}

在这里插入图片描述
运行效果与前面一样

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

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

相关文章

空调制冷量和功率有什么关系?

空调的制冷量和功率是衡量空调性能的两个核心参数,二者既有区别又紧密相关,以下是具体解析: 1. 基本定义 制冷量(Cooling Capacity)指空调在单位时间内从室内环境中移除的热量,单位为 瓦特(W) 或 千卡/小时(kcal/h)。它直接反映空调的制冷能力,数值越大,制冷效果越…

【prometheus+Grafana篇】Prometheus与Grafana:深入了解监控架构与数据可视化分析平台

&#x1f4ab;《博主主页》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果觉得文章对你有所帮…

基于n8n的AI应用工作流原理与技术解析

基于n8n的AI应用工作流原理与技术解析 在AI技术深度融入企业数字化转型的今天&#xff0c;开源工作流自动化工具n8n凭借其灵活的架构和强大的集成能力&#xff0c;成为构建智能自动化流程的核心引擎。本文将从技术原理、AI融合机制、典型应用场景三个维度&#xff0c;解析n8n在…

经济指标学习(二)

系列文章目录 文章目录 系列文章目录1、市净率**一、定义与计算****二、核心意义****三、应用场景****四、局限性****五、分类与衍生指标****总结** 2、市销率**一、定义与计算****二、核心意义****三、优缺点分析****四、适用场景****五、与其他指标的对比****六、实际应用案例…

大语言模型减少幻觉的常见方案

什么是大语言模型的幻觉 大语言模型的幻觉&#xff08;Hallucination&#xff09;是指模型在生成文本时&#xff0c;输出与输入无关、不符合事实、逻辑错误或完全虚构的内容。这种现象主要源于模型基于概率生成文本的本质&#xff0c;其目标是生成语法合理、上下文连贯的文本&…

CSS 美化页面(四)

一、浮动float属性 ‌属性值‌‌描述‌‌适用场景‌left元素向左浮动&#xff0c;腾出右侧空间供其他元素使用&#xff0c;其他内容会围绕在其右侧‌。横向排列元素&#xff08;如导航菜单&#xff09;、图文混排布局‌。right元素向右浮动&#xff0c;腾出左侧空间供其他元素使…

如何将 .txt 文件转换成 .md 文件

一、因为有些软件上传文件的时候需要 .md 文件&#xff0c;首先在文件所在的目录中&#xff0c;点击“查看”&#xff0c;然后勾选上“文件扩展名”&#xff0c;这个时候该目录下的所有文件都会显示其文件类型了。 二、这时直接对目标的 .txt 文件进行重命名&#xff0c;把后缀…

C++ 迭代器失效详解:如何避免 vector 操作中的陷阱

目录 1. 什么是迭代器失效&#xff1f; 2. 哪些操作会导致迭代器失效&#xff1f; 2.1 vector 的插入操作&#xff08;push_back, insert&#xff09; 示例&#xff1a;push_back 导致迭代器失效 如何避免&#xff1f; 2.2 vector 的删除操作&#xff08;erase, pop_back&…

(EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 EtherCAT 转 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关&#xff0c;为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案&#xff0c;可以轻松容易将 EtherNet/IP 网络接入 EtherCAT 网络中&#xff0c;方便…

榕壹云酒水定制系统:基于THinKPHP+MySQL+UniApp打造数字化时代的个性化购酒新体验

数字化浪潮下的酒水定制新机遇 在消费升级与个性化需求崛起的背景下&#xff0c;传统酒水行业正面临数字化转型的迫切需求。为此&#xff0c;我们团队基于ThinkPHPMySQLUniApp技术栈&#xff0c;开发了一套榕壹云酒水定制系统&#xff0c;旨在通过数字化手段解决消费者个性化购…

GR00T N1:面向通用类人机器人的开放基础模型

摘要 通用型机器人需要具备多功能的身体和智能的大脑。近年来&#xff0c;类人机器人的发展在构建人类世界中的通用自主性硬件平台方面展现出巨大潜力。一个经过大量多样化数据源训练的机器人基础模型&#xff0c;对于使机器人能够推理新情况、稳健处理现实世界的多变性以及快…

WebRTC实时通话EasyRTC嵌入式音视频通信SDK,构建智慧医疗远程会诊高效方案

一、方案背景 当前医疗领域&#xff0c;医疗资源分布不均问题尤为突出&#xff0c;大城市和发达地区优质医疗资源集中&#xff0c;偏远地区医疗设施陈旧、人才稀缺&#xff0c;患者难以获得高质量的医疗服务&#xff0c;制约医疗事业均衡发展。 EasyRTC技术基于WebRTC等先进技…

深入理解主成分分析(PCA):原理、算法与应用

内容摘要 本文深入剖析主成分分析&#xff08;PCA&#xff09;技术。介绍其通过正交变换简化数据维度的核心原理&#xff0c;详细推导基于最小投影距离和最大投影方差的算法过程&#xff0c;总结算法流程步骤。全面分析PCA的优缺点&#xff0c;并对比其与KPCA的差异。同时阐述…

uniapp-商城-25-顶部模块高度计算

计算高度&#xff1a; 使用computed进行顶部模块的计算。 总高度&#xff1a;bartotalHeight log 介绍--收款码这一条目 也就是上一章节的title的高度计算 bodybarheight。 在该组件中&#xff1a; js部分的代码&#xff1a; 包含了导出的名字&#xff1a; shop-head…

【MCP】第一篇:MCP协议深度解析——大模型时代的“神经连接层“架构揭秘

【MCP】第一篇&#xff1a;MCP协议深度解析——大模型时代的"神经连接层"架构揭秘 一、什么是MCP&#xff1f;二、为什么需要MCP&#xff1f;三、MCP的架构四、MCP与AI交互的原理4.1 ReAct&#xff08;Reasoning Acting&#xff09;模式4.2 Function Calling 模式 五…

李飞飞团队新作WorldScore:“世界生成”能力迎来统一评测,3D/4D/视频模型同台PK

从古老神话中对世界起源的幻想&#xff0c;到如今科学家们在实验室里对虚拟世界的构建&#xff0c;人类探索世界生成奥秘的脚步从未停歇。如今&#xff0c;随着人工智能和计算机图形学的深度融合&#xff0c;我们已站在一个全新的起点&#xff0c;能够以前所未有的精度和效率去…

[react]Next.js之自适应布局和高清屏幕适配解决方案

序言 阅读前首先了解即将要用到的两个包的作用 1.postcss-pxtorem 自动将 CSS 中的 px 单位转换为 rem 单位按照设计稿尺寸直接写 px 值&#xff0c;由插件自动计算 rem 值 2.amfe-flexible 动态设置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根据设备屏幕宽度和…

C# 如何比较两个List是否相等?

简介 在 C# 里&#xff0c;比较两个 List 是否相等&#xff0c;需要考虑多个方面&#xff0c;例如列表中的元素顺序、元素本身是否相等。下面介绍几种常见的比较方法&#xff1a; 基本类型比较&#xff08;元素顺序必须一致&#xff09; var list1 new List<int> { 1…

【技术派后端篇】Redis分布式锁:原理、实践与应用

在当今的高并发系统中&#xff0c;分布式锁是保障数据一致性和系统稳定性的重要手段。今天&#xff0c;我们就来深入探讨一下Redis分布式锁&#xff0c;揭开它神秘的面纱。 1 本地锁与分布式锁的区别 在Java开发的早期阶段&#xff0c;我们接触过synchronized和Lock锁&#x…

奥比中光tof相机开发学习笔记

针对奥比中光 tof相机&#xff0c;官方提供的资料如下ProcessOn Mindmap|思维导图 Orbbec SDK Python Wrapper基于Orbbec SDK进行设计封装&#xff0c;主要实现数据流接收&#xff0c;设备指令控制。下面就其开发适配进行如下总结&#xff1a; &#xff08;1&#xff09;系统配…