QT初识

通过图形化界面输出helloworld

既然学习了QT,那么自然要做经典的输出helloworld字符串的实验。

QT有两好几种方案输出helloworld,一种是通过图形化界面输出,一种是通过代码实现。

这里先了解图形化界面的方案。

创建项目后,点击 .ui 文件进入到QTdesigner界面。

然后在左边的控件中,选择一个标签控件,拖拽到画布上后。

然后双击该标签,即可输入文本字符串。 

 

这样运行后的窗口就自带一个 helloworld 字符串了。

然后再点击编辑查看 .ui 文件的本体,可以发现 xml 格式中出现了一个字符串,其值是 ''helloworld''

 通过纯代码输出helloworld

首先在 mainwindow.cpp 中,找到 MainWindow 的构造函数。

然后包含头文件 QLabel,之后创建一个 QLabel 对象,并且设置字符串 'hello world' 即可。

不过这里没有设置标签的位置,因此默认在左上角。 

这里的 QLabel 对象是通过 new 得到的,但是我这里并没有通过其他函数来将该对象的内存释放

这会不会造成内存泄漏呢?实际上是不会的。

对象树

在QT中有一个新概念——对象树。

对象树是一种多叉树,树的节点都是一个个new出来的对象。

在对象 new 的时候可以指定它的 parent ,通过该 parent 指针来将对象挂在对象树上。

这样一个对象的生命周期就由对象树管理起来了。

而如果没有挂在对象树上,就需要手动释放了

在QTdesigner中可以看到对象树的结构。

这里的 label 对象就是挂在一个 QWidget 类对象下面,而这棵树就是 MainWindow。 

验证对象树是否会释放节点

首先我们需要自己定义一个新类。

在左上角点击新建文件或项目。

 选择文件和类中的 C++,并且选择C++Class

 然后设定该类的名称,最好类名和头文件的名称相同。

然后设定添加到哪个项目中,点击确定就完成了。

 这样就成功创建一个头文件和cpp文件了。

#ifndef MYLABEL_H
#define MYLABEL_H#include <QMainWindow>
#include <QLabel>class MyLabel : public QLabel
{Q_OBJECT
public:MyLabel(QWidget * parent);~MyLabel();
};#endif // MYLABEL_H

因为是需要挂在 QWidget 下的,因此需要在构造函数时将传入 QWidget 指针用以挂在对象树上。

而且这个 MyLabel 是直接继承自 QLabel 的,因此可以直接使用 QLabel 的函数。

其次 QT 有一个小技巧。

如果一个类有声明了但是没有定义的函数,可以将光标移到该函数,然后通过 alt + enter 后即可在 .cpp 文件中直接定义。 

#include "mylabel.h"
#include<iostream>
using namespace std;MyLabel::MyLabel(QWidget * parent) : QLabel(parent)
{}MyLabel::~MyLabel()
{cout<<"MyLabel 被析构了!"<<endl;
}

定义完后我们直接定义好 .cpp 函数的实现。

 接着在 MainWindow 中使用 MyLabel 来挂在对象树上,然后运行。

可以发现成功输出了,然后关闭窗口。

即可在 应用输出窗口 中看到输出的析构函数的内容,不过有乱码。

这是因为中文具有两种不同的字符编码集,如果文件的编码集和工具的编码集不同,就会出现这种乱码问题。

虽然 Windows 上有这个问题,不过 linux 上的QT就没有问题。

这里我们可以使用QT提供的 QDebug 类来输出,它会自动处理字符编码集的转换问题。

 QDebug 的使用方式和 cout 类似,不过不需要手动换行,它会自动换行。

并且 QDebug 正如名字所说,是用于调试的工具,它输出的内容只有在 Debug 版本下才能看到,可以通过编译开关一键关闭。

通过按钮输出helloworld

图形化方式

在 QTDesigner 中还有很多其他的控件可以实现输出 helloworld 的功能。

我们可以通过图形化界面的方式来输出 hello world。

比如这样就能够直接输出,不过只是单纯的输出实在是无聊了。

那么我们设置成按下这个按钮后,按钮的文本就会改变应该如何做呢?

当我们为画布添加了一个控件时,点击这个控件可以看到它的名字,我们能够手动修改,这里按钮的名字就是 pushButton 。

而当我们在界面下用鼠标对 pushButton 按下去后,会对这个界面发送一个信号——clicked。

我们可以通过 connect 函数来将这个信号和一个函数进行连接,这样按下这个按钮后就会自动执行这个函数。

这一部分是信号与槽的内容,不过可以先了解一下。

这个信号是 ui 界面中的 pushButton 发出的发出的信号是 QPushButton 中的 clicked 信号接受信号的是 this ,也就是 MainWindow 对象来处理,其处理动作是 clickHandler,也就是用户自己设置的函数或是QT自定义的其他函数,这里是我自己设置的函数。 

这个函数的动作就是 : 如果按钮的文本是 "hello world" 就把文本替换成 "hello qt",否则替换成"hello world"。

 

可以看到成功替换了文本。

代码方式 

首先在 MainWidos.h 中设置 QPushButton 成员变量。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void clickHandle();
private:Ui::MainWindow *ui;QPushButton* myButton;
};
#endif // MAINWINDOW_H

然后在 MainWindow.cpp 中自己设置和 connect 即可。 


#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);myButton = new QPushButton(this);myButton->setText("hello world");connect(myButton,&QPushButton::clicked,this,&MainWindow::clickHandle);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::clickHandle()
{if(myButton->text() == "hello world"){myButton->setText("hello qt");}else{myButton->setText("hello world");}
}

可以看到确实实现了。 

QT的坐标系

QT的坐标系并不是以左下角为(0,0)的,而是以左上角为 (0,0) 的,也就是左手坐标系。

这也是为什么我们使用代码的方式来使用控件的时候,它们的位置默认在左上角。

我们可以通过 move 函数来移动它们的位置。

我们将 myButton 按钮移动到距离 MainWindow 的 (0,0) 位置 为 (200,500) 的位置。

 

发现按钮的位置不在左上角了!

而 MainWindow 此时是 myButton 这个对象的父节点,那么 MainWindow 呢?它的父节点呢?

其实 MainWindow 的父节点就是显示器,也就是说如果我们调用 MainWindow 的 move 函数,就能修改窗口的位置!

 我们在 main.cpp 中调用 move 函数。

发现位置改变了。

而 move 函数移动的单位是什么呢?实际上就是电脑显示器的像素点。 

总结

通过本文我们了解了 QT 能够通过图形化界面简单快速的实现一个页面,也能够通过代码直接使用控件。

并且了解到 QT 开辟的内存可以通过挂在对象树的方式来控制生命周期,而不用手动释放。并且了解到一些前置的信号与槽的见到应用,以及QT的坐标系。相信对大家一定会有所帮助。

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

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

相关文章

小米一面:说说MVC与设计模式的关系

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩。 先来看看面试环节吧。 面试官&#xff1a;请说说MVC模式是基于哪种设计模式的&#xff1f; 求职者&#xff1a;MVC本身不就是一种设计模式吗&#xff1f; 面试官&#xff1a;我的意思是&#xff0c;MVC是基于23中设计…

考研数学|武忠祥强化课VS张宇强化课(全面对比)

在我看来&#xff0c;这两个老师都很好&#xff0c;选者任何一个都不会踩坑&#xff01; 区别就是&#xff0c;这两个老师属于不同的打法&#xff01; 张宇老师属“仙人指路”型&#xff0c;他会在强化课程&#xff0c;把各种类型的习题总结在一起&#xff0c;然后给学生讲清…

docker内实现多机多卡分布式训练

docker内实现多机多卡分布式训练 1. 多台docker宿主机网络配置2. 创建overlay 网络3. 注意 1. 多台docker宿主机网络配置 https://docs.docker.com/network/overlay/ 这里需要创建overlay网络使得多台宿主机的容器可以通过网络连接 初始化swarm集群&#xff0c;并设置主节点&a…

C语言实现扫雷游戏完整实现(上)

文章目录 前言一、新建好头文件和源文件二、实现游戏菜单选择功能三、定义游戏函数四、初始化棋盘五、 打印棋盘函数六、布置雷函数七、玩家排雷菜单八、标记功能的菜单九、标记功能菜单的实现总结 前言 C语言从新建文件到游戏菜单&#xff0c;游戏函数&#xff0c;初始化棋盘…

鸿蒙OpenHarmony【小型系统运行案例】 (基于Hi3516开发板)

运行 启动系统 在完成Hi3516DV300的烧录后&#xff0c;还需要设置BootLoader引导程序&#xff0c;才能运行OpenHarmony系统。 在Hi3516DV300任务中&#xff0c;单击Configure bootloader&#xff08;Boot OS&#xff09;进行配置即可。 说明&#xff1a; DevEco Device Tool…

Leecode125. 验证回文串

文章目录 概要分析整体架构流程小结 概要 提示&#xff1a;这里可以添加技术概要 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符…

Java线程技术难点

文章目录 Java线程技术涵盖了许多关键概念和复杂机制&#xff0c;其中一些难点包括但不限于以下几个方面&#xff1a; 线程生命周期管理&#xff1a; 状态转换&#xff1a;理解线程的五种基本状态&#xff08;新建、就绪、运行、阻塞、死亡&#xff09;&#xff0c;以及状态之间…

C语言学习/复习30--结构体的声明/初始化/typedef改名/内存对齐大小计算

一、自定义数据类型 二、结构体 1.结构体的定义&#xff08;与数组相对比&#xff09; 2.结构体全局/局部变量的定义 3.typedef对结构体改名 4.匿名结构体类型的声明 注意事项1&#xff1a; 匿名后必须立即创建结构体变量 、 5.结构体与链表节点定义 注意事项1&…

ASP.NET教务管理平台-权限及公共模块设计与开发

摘 要 随着教育改革的不断深化&#xff0c;高等院校的建设与发展对国民整体素质的提高起着越来越重要的作用&#xff0c;建立一套能够适应这些改变的行政管理方案也就显得尤为重要。对于教务处来说&#xff0c;将信息技术用于校务管理中便是迫切的要求。 教务系统中的用户…

黑马Minio(对象存储服务MinIO)

3.1 MinIO简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是…

Claude国内镜像网站

AI生产力工具Claude 3私藏链接大公开&#xff01; &#x1f680; 国内尚未开放注册&#xff1f;别担心&#xff0c;这里有你想要的解决方案&#xff01; &#x1f517; 私藏链接&#xff1a;https://hiclaude3.cn &#x1f31f; 推荐指数&#xff1a;&#x1f31f;&#x1f…

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南 由北京海特伟业任洪卓发布于2024年4月23日 随着“互联网”被提升为国家战略&#xff0c;传统行业与互联网的深度融合正在如火如荼地展开。在这一大背景下&#xff0c;海特伟业紧跟时代步伐&#xff0c;凭借其深厚…

深入解析 Odoo 在线客服模块 (im_livechat)

深入解析 Odoo 在线客服模块 (im_livechat) Odoo Livechat 是一款集成于 Odoo 平台的实时在线客服系统&#xff0c;它赋予用户在网页界面上直接与客服人员进行即时沟通的能力。本文将逐步剖析 Livechat 的实现细节&#xff0c;从入口模板文件的加载机制&#xff0c;到后端初始…

【Linux】文件描述符——有这篇就够了

目录 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切皆文件 缓冲区…

09_FreeRTOS任务通知

任务通知 任务通知常用任务通知API函数 任务通知 FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能&#xff0c;每个任务都有一个 32 位的通知值&#xff0c;在大多数情况下&#xff0c;任务通知可以替代二值信号量、计数信号量、事件组&#xff0c;也可以替代长度为 1 的队列…

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决 文章目录 1.前言2.doris是什么&#xff1f;2.1简介2.2介绍2.3使用场景2.4架构 3.官网4.构建部署4.1 构建环境4.2 doris2.0.4的fe和be镜像构建4.2.1 fe2.0.4镜像构建脚本4.2.2 be2.0.4镜像构建4.2.3 启动脚…

Java -- (part16)

一.多线程基础知识 1.进程:在内存中执行的应用程序 2.线程:进程中的一个最小的执行单元 3.并行:在同一时刻,有多个指令在多个CPU上同时执行 4.并发:在同一时刻,有多个指令在单个CPU上交替执行 5.CPU调度 a.分时调度 b.抢占式调度:Java程序 6.主线程:CPU和内存之间开辟的…

C++ CRUD programming for DB

1、ODBC 开放数据库互连&#xff0c;微软主导的关系型数据库接口标准&#xff0c;允许同一代码访问不同DBMS中的数据。小案例&#xff1a;C连接Access数据库----增删改查_c access数据库-CSDN博客 ODBC(Open Database Connectivity&#xff0c;开放数据库连接) ODBC是Microsof…

PCB的通孔、盲孔、埋孔

通孔&#xff1a;是从顶层到底层 盲孔&#xff1a;看不到头&#xff0c;跟井一样&#xff0c;起点永远是第一层 埋孔&#xff1a;是正反都看不到的 总结&#xff1a; 这些孔都是用来切换层的

超详细的Maven安装与使用还有内容讲解

文章目录 作用简介模型仓库 安装配置IDEA配置Maven坐标概念主要组成 IDEA创建Maven项目基本使用常用命令生命周期使用坐标导入jar包 注意事项清理maven仓库更新索引依赖 作用 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化…