QT基础 UI编辑器 QT5.12.3环境 C++环境

news2024/11/20 16:52:24

一、UI编辑器

注意:创建工程时,要勾上界面按钮

UI设计师界面的模块

UI编辑器会在项目构建目录中自动生成一个ui_xxx.h构建一次才能生成代码),来表示ui编辑器界面的代码,属于自动生成的,一定不要修改。修改界面属性,只能通过ui编辑器来做。

二、信号与槽

ui设计师界面,右键相应的组件,选择“转到槽”选项,会自动跳转到槽函数

这种方法不会有connect的体现,遵循的是qt内部匹配规则。

匹配规则:on_AAA_BBB:代表连接AAA对象的BBB信号到此槽。

比如响应对象myBtn的clicked信号,就会生成on_myBtn_clicked的槽。

过多使用此方法会导致信号与槽对应关系不明确,项目开发中不建议使用。

代码中取界面组件使用ui->取部件即可。

三、常用控件

QPushButton:按钮

QRadioButton:单选框

QCheckBox:多选框

QListWidget:列表部件

QTableWidget:表格组件

QGroupBox: 组框

QStackedWidget:堆栈窗体

QWidget:基础窗口部件

QComboBox:组合框

QLineEdit:单行文本框

QTextEdit:多行文本框

QTimeEdit:时间编辑框

QSpinBox:微调框

QSlider:滑动条

QLabel:标签   

QProgressBar:进度条


四、资源文件

1. 作用

        提供了和路径无关的资源管理,将资源编译到二进制文件中。

        PS: 图片资源的获取可以从阿里巴巴矢量图库找


2. 创建方法步骤

1) 新建文件 --> QT -->QT资源文件
2) 添加前缀
3) 添加文件, 注意:需要提前在工程的源文件中创建目录,然后把图片添加进去

3. 编程实例

问题:界面内容为:进度条、两个按钮+/-

        功能:点击+/-按钮后实现进度条变化并显示当前进度值,全部用代码实现。

        补充:增加图片,借助qt的资源文件,资源文件提供管理资源的方法,并且把资源编译到可执行文件中,和路径无关。

        方法:新建-->QT-->QT资源文件(提供图片资源)。


五、布局管理器

1. 界面布局的方法

        手工布局(绝对定位): (适用于测试某个小功能)。

        UI布局: 简单快捷,但不能做到自适应窗口,需要自己计算窗口位置和大小


2. 布局管理器布局(适用于真正项目开发):

        1) 子部件的定位
        2) 窗口的  合理默认空间
        3) 窗口的合理最小空间
        4) 窗口自适应管理
        5) 字体大小或者内容变化

详见帮助文档:Layout Management


3. 布局相关类的继承关系


4. 布局中的一些概念

margin(页边空白):布局和外围窗体之间的间隔

left  top  right  bottom

spacing:代表布局内部件之间的间隔

stretch:代表布局内部件所占的比例


5. 布局相关的方法

QHBoxLayout(QWidget * parent)
在parent部件上增加QHBoxLayout布局

void addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = 0)
布局上加部件

void addLayout(QLayout *layout, int stretch = 0)
布局上加布局

void QBoxLayout::addStretch(int stretch = 0)
在布局中增加指定比例的空白

void QBoxLayout::setStretch(int index, int stretch)
设置部件的比例

void QBoxLayout::setSpacing(int spacing)
设置部件之间的空白距离

void QBoxLayout::setMargin(int margin)

void QLayout::setContentsMargins(int left, int top, int right, int bottom)
设置布局和外围窗体之间的空白距离

如果定义布局对象时没有指定父对象,可以用如下方法显示的设置:

//此方法属于QWidget
void QWidget::setLayout(QLayout * layout)

1) 水平布局

案例需求:窗体上放置两个文本输入框, QTextEdit

横向均分两个文本输入框。使用代码来实现上述功能。需要自适应。

使用代码实现两个文本框的横向占比为1:2,中间再增加一份占比为1的空白,设置margin为5,设置spacing为10。


问题:根据设计图,完成双向进度条显示部件,要求界面可自适应,界面基础大小为300*50,总体使用横向布局。(图中数字为比例关系)

进度条无法自适应高度请参考sizePolicy属性帮助文档解决

//进度条样式参考:
#define  PROGRESS_LEFT_STYLE (QString(""\
    "QProgressBar {"\
    "background-color: #dbdee0;"\
    "border-right:1px solid #00ff00"\
    ""\
    "}"\
    "QProgressBar::chunk {"\
    "background-color:  #FF5500" "}"))
   
#define  PROGRESS_RIGHT_STYLE (QString(""\
    "QProgressBar {"\
    "background-color: #dbdee0;"\
    "border-left:1px solid #00ff00"\
    ""\
    "}"\
    "QProgressBar::chunk {"\
    "background-color:  #FF5500" "}"))

 代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtWidgets>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->resize(300,50);
    QProgressBar *left_bar = new QProgressBar(this);
    left_bar->setValue(50);
    left_bar->setInvertedAppearance(true); // 反转
    left_bar->setTextVisible(false); // 隐藏text
    left_bar->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); // 调整策略
    QProgressBar *right_bar = new QProgressBar(this);
    right_bar->setTextVisible(false);
    right_bar->setValue(30);
    right_bar->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);

    QHBoxLayout *hlayout = new QHBoxLayout; // 水平布局
    hlayout->addStretch(1);
    hlayout->addWidget(left_bar,14);
    hlayout->addWidget(right_bar,14);
    hlayout->addStretch(1);
    hlayout->insertSpacing(2,2);

    QVBoxLayout *vlayout = new QVBoxLayout(this); // 垂直布局
    vlayout->addStretch(1);
    vlayout->addLayout(hlayout,5);
    vlayout->addStretch(1);
}

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

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

输出:


2) 网格表格

相关方法

//构造函数
QGridLayout()
QGridLayout(QWidget *parent)

//添加布局
void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())

//添加控件
void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())

//设置行比例
void setRowStretch(int row, int stretch)

//设置列比例
void setColumnStretch(int column, int stretch)

案例需求:6个按钮按照两行三列布局,设置上下行按钮比例为1 : 2

代码:

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton *b1 = new QPushButton;
    b1->setText("1");
    b1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPushButton *b2 = new QPushButton;
    b2->setText("2");
    b2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPushButton *b3 = new QPushButton;
    b3->setText("3");
    b3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPushButton *b4 = new QPushButton;
    b4->setText("4");
    b4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPushButton *b5 = new QPushButton;
    b5->setText("5");
    b5->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPushButton *b6 = new QPushButton;
    b6->setText("6");
    b6->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    QGridLayout *layout = new QGridLayout; // 网格布局
    this->setLayout(layout); // 将布局加入界面
    layout->addWidget(b1,0,0,1,1); // 将部件加入布局
    layout->addWidget(b2,0,1,1,1);
    layout->addWidget(b3,0,2,1,1);
    layout->addWidget(b4,1,0,1,1);
    layout->addWidget(b5,1,1,1,1);
    layout->addWidget(b6,1,2,1,1);

    layout->setMargin(0); // 设置边距

    layout->setSpacing(0); // 设置各部件之间的间距

    layout->setRowStretch(0,1); // 设置某一行的伸缩比例
    layout->setRowStretch(1,2);
}

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

输出:

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

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

相关文章

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

高阶C语言之五:(数据)文件

目录 文件名 文件类型 文件指针 文件的打开和关闭 文件打开模式 文件操作函数&#xff08;顺序&#xff09; 0、“流” 1、字符输出函数fputc 2、字符输入函数fgetc 3、字符串输出函数fputs 4、 字符串输入函数fgets 5、格式化输入函数fscanf 6、格式化输出函数fpr…

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…

如何管理服务中的 “昂贵” 资源

如果接触过实际大型业务系统&#xff0c;就能体会到许多业务的正常运行都依赖于各种昂贵的第三方接口&#xff0c;调用一次都是要花元子的&#xff0c;例如 大语言模型nlp 服务&#xff1a;信息提取、分类等cv 服务&#xff1a;定位、信息提取、分类等 然而经常可能由于各种无…

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…

CSS遮罩:mask

CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…

Zabbix:使用CentOS 9,基于LNMP平台,源码部署Zabbix 7。

ZBX&#xff1a;源码部署Zabbix 7 一、Zabbix概述1. 什么是zabbix2. 为什么学习zabbix3. 逻辑架构3. 实验环境4. 软件下载&#xff1a; 二、安装前的系统准备工作1. 配置主机名2. 关闭防火墙3. 关闭selinux4. 配置yum源5. 配置时钟同步6. 优化系统限制7. 安装JDK 三、部署LNMP环…

5G与4G互通的桥梁:N26接口

5G的商用部署进程将是一个基于4G系统进行的长期的替换、升级、迭代的过程&#xff0c;4G系统是在过渡到5G全覆盖过程中&#xff0c;作为保障用户业务连续性体验这一目的的最好补充。 因此4G/5G融合组网&#xff0c;以及互操作技术将是各大运营商在网络演进中需要重点考虑的问题…

【计算机网络实验】之静态路由配置

【计算机网络实验】之静态路由配置 实验题目实验目的实验任务实验设备实验环境实验步骤路由器配置设置静态路由测试路由器之间的连通性配置主机PC的IP测试 实验题目 静态路由协议的配置 实验目的 熟悉路由器工作原理和机制&#xff1b;巩固静态路由理论&#xff1b;设计简单…

【专题】2024AIGC创新应用洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38310 在科技日新月异的今天&#xff0c;人工智能领域正以前所未有的速度发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;成为其中最耀眼的明珠。从其应用场景的不断拓展&#xff0c;到对各行业的深刻变革&#xff0…

微知-动态链接库导出的三种方式?(LD_LIBRARY_PATH, /etc/ld.so.conf, -Wl,-rpath)

背景 经常需要导出动态库&#xff0c;最场景的方式是指定LD_LIBRARY_PATH。本文介绍3中 LD_LIBRARY_PATH 这种方式临时生效 export LD_LIBRARY_PATH/path/to/mylibdir:$LD_LIBRARY_PATH使用ldconfig和/etc/ld.so.conf 在配置文件 /etc/ld.so.conf 中指定动态库搜索路径。每…

Jenkins更换主题颜色+登录页面LOGO图片

默认主题和logo图片展示 默认主题黑色和白色。 默认LOGO图片 安装插件 Login ThemeMaterial Theme 系统管理–>插件管理–>Available plugins 搜不到Login Theme是因为我提前装好了 没有外网的可以参考这篇离线安装插件 验证插件并修改主题颜色 系统管理–>A…

HTB:Arctic[WriteUP]

目录 连接至HTB服务器并启动靶机 信息搜集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用curl访问靶机8500端口 漏洞利用 使用浏览器访问URL&#xff1a;http://10.10.10.11:8500 使用searchsploit搜索该WebAPP 启动Metasplo…

利用正则表达式批量修改文件名

首先&#xff0c; 我们需要稍微学习一下正则表达式的使用方式&#xff0c;可以看这里&#xff1a;Notepad正则表达式使用方法_notepad正则匹配-CSDN博客 经过初步学习之后&#xff0c;比较重要的内容我做如下转载&#xff1a; 元字符是正则表达式的基本构成单位&#xff0c;它们…

qt之QFTP对文件夹(含嵌套文件夹和文件)、文件删除下载功能

一、前言 主要功能如下&#xff1a; 1.实现文件夹的下载和删除&#xff0c;网上很多资料都是单独对某个路径的文件操作的&#xff0c;并不能对文件夹操作 2.实现目标机中含中文名称自动转码&#xff0c;有些系统编码方式不同&#xff0c;下载出来的文件会乱码 3.实现ftp功能…

核心社群营销和覆盖区域选型

目录 一、背景介绍 &#xff08;一&#xff09;核心流程 &#xff08;二&#xff09;用户进群 &#xff08;三&#xff09;内容匹配 &#xff08;四&#xff09;数据追踪 &#xff08;五&#xff09;风险管控 二、业界调研 三、聚焦群覆盖区域 &#xff08;一&#xf…

计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理汽车资讯网站的相关信息成为必然…

Java成员变量 成员方法的访问特点 结构体(上)

1. &#xff08;1&#xff09; public class dog {public void eat(){System.out.println("在吃狗粮");}public void drink(){System.out.println("在喝水");}public void lookhome(){System.out.println("在看家");} } &#xff08;2&#x…

ctfshow-web入门-SSRF(web351-web360)

目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数&#xff0c;很典型的 SSRF 尝试使用 file 协议读文件&#xff1a; urlfile:///etc/passwd 成功读取到 /etc/passwd 同…