Qt_day4_Qt_UI设计

目录

Qt_UI设计

1. Designer 设计师(掌握)

2. Layout 布局(重点)

2.1 基本使用

2.2 高级用法

2.3 代码布局(了解)

3. Designer与C++的关系(熟悉)

4. 基本组件(掌握)

4.1 QWidget

4.2 QLabel 标签

4.3 QAbstractButton 按钮类

4.4 QLineEdit 单行文本输入框

4.5 QComboBox 组合框

4.6 一组与数字相关的组件


Qt_UI设计

1. Designer 设计师(掌握)

    Designer是Qt内置的一款界面设计程序,设计的界面文件为.ui格式。

    C++程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选项。

这样的项目自带dialog.ui,双击dialog.ui可以直接使用Designer程序打开此文件。

2. Layout 布局(重点)

2.1 基本使用

    可以把布局看做是一个透明的盒子,内部放置各种组件对象,这些组件对象会按照布局预设的规则自动排序,并形成一个布局整体。

Qt中有四种布局:

    主要学习前两种,垂直/水平布局指的是布局中所有的子组件垂直/水平排成一排,常用属性如下:

    需要注意的是,最终的显示效果是多个因素综合决定的,并非一个因素完全决定。

2.2 高级用法

  • 伸展器

如果需要在布局中填充空白,可以使用伸展器组件。

  • 嵌套

布局和布局之间可以嵌套,内层布局相当于外层布局的一个组件。

  • 贴合

    选中窗口对象,点击,可以让最外层布局贴合窗口,以达到窗口大小自适应效果。

可以点击打破任何一个选中的布局,例如取消贴合效果,需要先选中窗口,然后点击此按钮。

2.3 代码布局(了解)

    也可以使用C++进行布局,仅做展示。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();private:QVBoxLayout* layout;QPushButton* btn1;QPushButton* btn2;
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(400,400);layout = new QVBoxLayout(this);btn1 = new QPushButton("A",this);btn2 = new QPushButton("B",this);// 把两个按钮加入到布局中layout->addWidget(btn1);layout->addWidget(btn2);
}Dialog::~Dialog()
{delete layout;delete btn1;delete btn2;
}

虽然代码布局复杂,但是性能好。

3. Designer与C++的关系(熟悉)

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui; // ui指针:界面文件的对象化
};#endif // DIALOG_H

dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) // 构造初始化列表
{// 按照ui文件设计内容在C++中创建对象并初始化ui->setupUi(this);// 可以通过ui指针+对象名称,在C++中找到ui中的对象ui->pushButtonA->setText("是不是?");
}Dialog::~Dialog()
{// 销毁ui,一并销毁ui文件中所有的对象delete ui;
}

    因为Designer造成的开销相对于常用的Windows而言微不足道,因此后续界面设计都使用Designer,创建的项目要求勾选“创建界面文件”。

4. 基本组件(掌握)

4.1 QWidget

    QWidget是所有组件的基类,因此其属性被所有组件继承,在Designer中这些属性显示为淡黄色,常用属性如下:

4.2 QLabel 标签

QLabel用于显示文字或图片,此组件仅用于显示,不能交互。

常用属性如下:

Qt项目中正规使用图片的方式需要先把图片资源导入到项目中,然后再使用图片资源,不可直接使用图片文件,操作步骤如下:

1. 准备好图片文件,要求格式:png(包含透明图层)、jpg(不包含透明图层)、webp(在部分Qt版本支持)等。明明合法(英文数字组合),分辨率和文件大小不要过高。

2. 把图片文档放置到工作目录中。

3. 在Qt Creator中,选中项目名称,鼠标右键,点击“添加新文件”。

    4. 在弹出的窗口中,按照下图所示进行操作。Qt Resource File表示资源管理文件,格式.qrc,用于管理导入到项目中的资源文件。

5. 在弹出的窗口中填写qrc资源管理文件的名称,例如res

6. 项目管理界面,直接点击完成。

7. 如果需要回到资源管理文件首页,如下图所示进行操作。

8. 第一次给资源管理文件导入资源之前,需要先添加前缀,可以把前缀理解为是一个虚拟的路径。

9. 点击添加文件,可以把对应图片文件添加到当前前缀下。

10. 如果在C++代码中使用此图片,需要复制资源路径。

11. 如果在Designer中使用,需要先重新构建一次项目,点击可以构建但不运行项目。随后可以在Designer中配置资源图片的使用。

    通过C++代码对图片进行缩放的效果比Designer好一些,但是仍然建议使用专门的P图软件提前处理好。

相关函数如下:

// QPixmap的构造函数
// 参数为文件名称,即“虚拟路径”
QPixmap::​QPixmap(const QString & fileName)

// 缩放拉伸图片
// 参数1:目标宽度
// 参数2:目标高度
// 参数3:拉伸模式,三个枚举值
// 参数4:转换模式,两个枚举值,分别表示速度优先和质量优先
// 返回值:转换后的图片对象
QPixmap QPixmap::​scaled(
int width, 
int height, 
Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const

QLabel也支持gif动图显示,需要配合QMovie类型播放动图,相关函数如下:

// 构造函数
// 参数1:文件名称,即“虚拟路径”
// 参数3是parent,因此用堆内存
QMovie::​QMovie(const QString & fileName)
// 开始播放
void QMovie::​start()                [slot]

以上练习的源代码:

通过网盘分享的文件:Day2_24072_QLabel (2).zip

链接: https://pan.baidu.com/s/1G16UlAj03skrUNsMnJviQw 提取码: gjee

--来自百度网盘超级会员v7的分享

4.3 QAbstractButton 按钮类

QAbstractButton是按钮的抽象基类,包含四种常见的派生类:

需要注意的是,QRadioButton需要分组互斥,使用QGroupBox组件进行分组。

按钮类常用属性如下:

图标是一种特殊的图片,具有以下性质:

  • 分辨率1:1
  • 包含透明图层
  • 格式通常为png和ico

可以通过专门的图标下载网站进行学习交流:

iconfont-阿里巴巴矢量图标库iconfont-国内功能很强大且图标内容很丰富的矢量图标库,提供矢量图标下载、在线存储、格式转换等功能。阿里巴巴体验团队倾力打造,设计和前端开发的便捷工具icon-default.png?t=O83Ahttps://www.iconfont.cn/

按钮类常用信号如下:

     如果按钮比较多需要很多信号槽的连接,除了可以使用多对一的连接方式以外,还可以使用QButtonGroup对按钮进行分组,可以针对一个组设置信号槽。QButtonGroup不继承QWidget,直接继承QObject,因此没有任何显示效果,只是一种逻辑分组。

相关函数如下:

// 构造函数
QButtonGroup::​QButtonGroup(QObject * parent = 0)
// 向组中添加按钮并编号
// 参数1:按钮对象
// 参数2:按钮编号,建议非重复正数
void QButtonGroup::​addButton(QAbstractButton * button, int id = -1)

信号函数如下:

    信号函数分为四组,对应的触发效果就是之前QAbstractButton信号的四种效果,区别每组重载函数的参数不同。QAbstractButton*表示当前组中触发的组件地址,int表示当前组中触发的组件编号。

需要注意的是,QButtonGroup默认会让按钮互斥,因此需要更改exclusive : bool属性值为false。

通过网盘分享的文件:Day3_24072_QButton.zip

链接: https://pan.baidu.com/s/1iPBs-PsaZg5bLJvkiCOCqw 提取码: h8e6

--来自百度网盘超级会员v7的分享

4.4 QLineEdit 单行文本输入框

    QLineEdit可以让用户输入一个单行文本,常用属性如下:

信号函数如下:

通过网盘分享的文件:Day3_24072_QLineEdit.zip

链接: https://pan.baidu.com/s/1aGU3CMl6q1jjnFeujMzJLQ 提取码: a2a4

--来自百度网盘超级会员v7的分享

4.5 QComboBox 组合框

QComboBox可以点击出现一个下拉菜单,用户选择其中的一个选项(Item)。

常用属性如下:

信号函数如下:

通过网盘分享的文件:Day3_24072_QComboBox.zip

链接: https://pan.baidu.com/s/1T-hYrHTyXkCcd6FR6rtmZg 提取码: 5d7f

--来自百度网盘超级会员v7的分享

4.6 一组与数字相关的组件

以上组件共同的属性包括:

  • value : int

当前数值

  • maximum : int

最大值,以上组件中只有QProgressBar默认最大值为100,其他组件为99。

  • minimum : int

最小值,默认值为0。

以上组件共有的信号函数:

// 参数为新的value值
void valueChanged(int value)                 [signal]

一个属性值发生变化时发射的信号在属性文档中会出现在部分。

通过网盘分享的文件:Day3_24072_Value.zip

链接: https://pan.baidu.com/s/1I3n1cPLorXmCQsyIcVXnPA 提取码: vnkg

--来自百度网盘超级会员v7的分享

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

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

相关文章

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班&#xff0c;有空闲时间。争取一天学一课&#xff0c;养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

Elastic Observability 8.16:增强的 OpenTelemetry 支持、高级日志分析和简化的入门流程

作者&#xff1a;来自 Elastic Luca Wintergerst, Alex Fedotyev, Vinay Chandrasekhar, Miguel Luna Elastic Observability 8.16 宣布了几个关键功能&#xff1a; Amazon Bedrock 集成 LLM 可观察性为基于 Amazon Bedrock 构建的 LLM 应用程序添加了全面的监控功能。这种新的…

Bugku CTF_Web——文件上传

Bugku CTF_Web——文件上传 进入靶场 My name is margin,give me a image file not a php抓个包上传试试 改成png也上传失败 应该校验了文件头 增加了文件头也不行 试了一下 把文件类型改成gif可以上传 但是还是不能连接 将Content-Type改大小写 再把文件后缀名改成php4 成…

车-路-站-网”信息耦合的汽车有序充电

电动汽车作为一种环保、的交通工具&#xff0c;正逐渐成为未来交通的发展趋势。然而&#xff0c;大规模电动汽车的无序充电可能导致电网负荷波动、电压下降等问题&#xff0c;影响电网的安全稳定运行。为了解决这些问题&#xff0c;需要制定有效的电动汽车有序充电策略&#xf…

Microsoft 365 Exchange如何设置可信发件IP白名单

1、 进入到 Microsoft 365 admin center 管理中心 &#xff0c;点击 管理中心 下的 安全 在弹出的新页面中&#xff0c;依次点击 策略和规则 – 威胁策略 – 反垃圾邮件 再单击 连接筛选器策略(默认) – 编辑连接筛选器策略 2、在 IP 允许列表 中添加可信邮件 IP 段&#xff0…

什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性

什么是 OpenGL ES OpenGL ES 是一种为嵌入式系统和移动设备设计的3D图形API(应用程序编程接口)。它是标准 OpenGL 3D 图形库的一个子集,专门为资源受限的环境(如手机、平板电脑、游戏机和其他便携式设备)进行了优化。 由于其在移动设备上的广泛适用性,OpenGL ES是学习移…

力扣104 : 二叉树最大深度

补&#xff1a;二叉树的最大深度 描述&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 何解&#xff1f; 树一般常用递归&#xff1a;递到叶子节点开始倒着处理

免费,WPS Office教育考试专用版

WPS Office教育考试专用版&#xff0c;不仅满足了考试需求&#xff0c;更为教育信息化注入新动力。 https://pan.quark.cn/s/609ef85ae6d4

[运维][Nginx]Nginx学习(1/5)--Nginx基础

Nginx简介 背景介绍 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个【POP3/SMTP/IMAP代理服务器】&#xff0c;是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的&#xff0c;Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一…

《新智慧》期刊的征稿范围主要包括哪些方面?

一、教育教学理论与实践&#xff1a; 教学方法创新&#xff1a;例如新颖的课堂教学模式、教学策略的探索与实践&#xff0c;如小组合作学习、项目式学习、探究式学习等教学方法在不同学科教学中的应用及效果研究。 课程改革研究&#xff1a;对基础教育、中等教育阶段的课程改革…

Golang | Leetcode Golang题解之第559题N叉树的最大深度

题目&#xff1a; 题解&#xff1a; func maxDepth(root *Node) (ans int) {if root nil {return}queue : []*Node{root}for len(queue) > 0 {q : queuequeue nilfor _, node : range q {queue append(queue, node.Children...)}ans}return }

C++初阶:类和对象(上)

1. 类的定义 1.1 类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{ } 中为类的主体&#xff0c;注意类定义结束后的分号不能省略。类体中的内容为类的成员&#xff1a;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方法或成员…

linux设置主机名

1、查看主机名 hostname默认&#xff1a; localhost.localdomain 2、更改主机名 编辑/etc/hostname&#xff0c;修改成自己需要的主机名&#xff0c;如self-name 3、设置hosts 编辑/etc/hosts&#xff0c;将修改的主机名增加一个映射 127.0.0.1 localhost localhost.lo…

MybatisPlus入门(十)MybatisPlus-逻辑删除和多记录操作

一、Mybatis-Plus 多记录操作 按照主键删除多条记录 List<Long> ids Arrays.asList(new Long[]{2,3}) userDao.deleteBatchIds(ids); 示例代码如下: Testvoid testDelete(){//删除指定多条数据List<Long> list new ArrayList<>();list.add(14025513424818…

解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url

解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url 第一类情况 在anaconda创建新环境时&#xff0c;使用如下代码 conda create -n charts python3.7 错误原因&#xff1a; 默认镜像源访问速度过慢&#xff0c;会导致超时从而导致更新和下载失败。 解决方…

Python数据类型(一):bool布尔类型

Python数据类型系列目录 Python数据类型&#xff08;一&#xff09;&#xff1a;bool布尔类型 文章目录 一、创建bool值二、逻辑运算符三、布尔类型与其他类型的转换四、条件判断五、循环控制六、相关问答 在Python编程语言中&#xff0c;布尔类型是一种基本的数据类型&#x…

C++面试基础知识:排序算法 C++实现

上周实习面试&#xff0c;手撕代码快排没写出来&#xff0c;非常丢人&#xff0c;把面试官都给逗笑了。 基础不牢&#xff0c;地动山摇&#xff0c;基础的算法还是要牢记于心的。 插入排序 分为有序区和无序区&#xff0c;每次从无序区中选出一个&#xff0c;放到有序区域中。…

LabVIEW开发相机与显微镜自动对焦功能

自动对焦是显微成像系统中的关键功能&#xff0c;通常由显微镜的电动调焦模块或特定的镜头系统提供&#xff0c;而工业相机则主要用于高分辨率图像的采集&#xff0c;不具备独立的自动对焦功能。以下是自动对焦的工作原理、实现方式及实际应用案例。 1. 自动对焦的工作原理 &a…

一文简单了解Android中的input流程

在 Android 中&#xff0c;输入事件&#xff08;例如触摸、按键&#xff09;从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次&#xff0c;包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程&#xff0c;并结合代码逐步了解…

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中&#xff0c;SendMessage方法是一个强大的工具&#xff0c;它允许我们与Windows API交互&#xff0c;模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数&#xff0c;它用…