布局管理和样式表

news2024/12/30 1:37:23

目录

手动操作

相关功能解释:

Qt Designer或者QC中的Spacer控件及其属性

网格布局

代码操作

setFocusPolicy()


如果不进行布局,意味着界面上的东西都是写死的。

当我们进行布局操作之后,控件的位置、大小一般会根据窗口缩放来自动调整。

  • QHBoxLayout  水平布局,从左往右水平排列部件
  • QVBoxLayout  垂直布局,从上往下垂直排列部件
  • QGridLayout  网格布局,将部件放置在二维网格中。
  • QFormLayout  用于表单的特殊布局
  • QStackedLayout  栈布局,允许将多个部件放在同一个位置

1.学习 Qt 我们必须经历几个阶段 我们尽量去手写所有界面业务代码,需要一年,经过一年大量的手写,这个时候 Qt 大部分东西我们就非常熟悉了.

2.第二个阶段,我们逐渐去写一些有含金量的代码,比如写复杂控件,复杂的业务。手写界面,写久了熟练了它就是个体力活.

3.这个时候,我可以用界面布局设计器,去偷懒快速去写一些东西。

手动操作

没有布局的时候是这样的图标:


在这里框选要进行布局设置的控件,然后点上面的水平布局或者垂直布局(这里我选的是垂直布局)

并且在右侧的Filter筛选器里也会发生变化:

如果想取消布局,也可以鼠标右键选中它,在布局里选择分拆。

也可以点这个按钮进行分拆:

相关功能解释:

framelayout 是基于表单的布局。

基于网格的布局:

Qt Designer或者QC中的Spacer控件及其属性

在Qt Designer中,Spacer控件是一种非常常用的控件,它可以帮助我们在界面布局中实现空白区域的占位,Spacer控件在布局调整和设计过程中有着重要的作用,但在使用过程中也需要注意一些属性的设置。


Spacer控件的常用属性有sizeType、 sizeHintstretch以及geometrv等。


sizeType属性的值为QSizePolicy中定义的枚举类型Q之一,包括Fixed、Minimum、Maximum、Preferred、Expanding和MinimumExpanding。这些枚举类型代表了不同的大小约束关系,详细说明如下:
。Fixed: 固定大小
。Minimum: 最小大小。
。Maximum: 最大大小
。Preferred:首选大小。
。Expanding:可扩展大小
。MinimumExpanding: 最小可扩展大小


我们可以根据具体的需求选择相应的sizeType类型,来指定Spacer控件的大小约束关系。

QSizePolicy::Fixed - the QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button).
缺省大小(sizehint)是唯一可以接收的改变,因此定义这种类型部件不会发生任何改变。

QSizePolicy::Minimum - the sizeHint() is minimal, and sufficient. The widget can be expanded, but there is no advantage to it being larger (e.g. the horizontal direction of a push button).
缺省大小定义的部件最小大小,并且是充分的。部件允许扩展,但是并不倾向扩展。

QSizePolicy::Maximum - the sizeHint() is a maximum. The widget can be shrunk any amount without detriment if other widgets need the space (e.g. a separator line).
缺省大小定义的部件是最大的,假如其它部件需要空间并且不会破坏这个部件,那么该部件允许缩小。

QSizePolicy::Preferred - the sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded, but there is no advantage to it being larger than sizeHint() (the default QWidget policy).
缺省大小是最佳效果,部件允许扩展或缩小,但并倾向于扩展(缺省策略)。

QSizePolicy::Expanding - the sizeHint() is a sensible size, but the widget can be shrunk and still be useful. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a slider).
缺省大小是合理的大小,但部件允许缩小并且可用。这个部件可以利用额外的空间,因此它将会得到尽可能多的空间。

QSizePolicy::MinimumExpanding - the sizeHint() is minimal, and sufficient. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a slider).
缺省大小是部件最小大小,并且是足够的。这个部件允许使用额外空间,因此它将会得到尽可能多的空间。

QSizePolicy::Ignored - the sizeHint() is ignored. The widget will get as much space as possible.
缺省大小将会被忽略,这个部件会得到尽可能多的空间。


设置下界面大小:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
  
    setMaximumSize(8000,6000);
    setMinimumSize(400,300);
}

先用创建两个小label:

具体字体的设置因人而异。

再弄一个line edit:

复制一份,文字改成密码:

再来个pushbutton:

复制一份弄成注册:

再弄一些弹簧,弄一些水平和垂直布局:最终就是这样样子:

然后再来个checkbox:

复制下,再弄个自动登录。

自动勾选代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->checkBox_2->setChecked(true);
}

网格布局

注意设置行高等参数,不要太拥挤。

代码操作

一开始,各种new的时候,不知道这些初始化有什么意义,又是怎么个作用机制,自己还是回去查了查。

在本部分写代码的时候,先创建一个widget项目,然后在类的.cpp文件里的主构造函数里添加以下代码(数值的地方可以自己调):

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTime>
#include <QTimer>   //计时器
#include<QVBoxLayout>
#include<QHBoxLayout>
#include<QLabel>
#include<QPushButton>
#include<QLineEdit>
#include<QCheckBox>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{

    ui->setupUi(this);
    ui->pushButton_no->setText("hao");
    setWindowTitle("CSDN");
    resize(1420,700); //刚运行的时候整个窗口的大小
    setMinimumSize(400,300);
    setMaximumSize(1420,700);
    setupLayout();
}
/*
resize()
此属性保持Widget的大小,不包括任何窗口框架。

如果Widget在调整大小时可见,它会立即接收一个调整大小事件(resizeEvent())。如果Widget当前不可见,则保证在显示之前接收到事件。

如果大小超出minimumSize()和maximumSize()定义的范围,则会调整大小。

默认情况下,此属性包含一个值,该之依赖于用户平台和屏幕几何图形的。
 */

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

void Widget::on_pushButton_clicked()
{}

void Widget::setupLayout()
{
    QVBoxLayout* pLayout= new QVBoxLayout(this); //创建一个垂直布局
    pLayout->addWidget(loadupLayout());
    pLayout->addWidget(loadmidLayout());
    pLayout->addWidget(loaddownLayout());
    setLayout(pLayout);
}

QWidget* Widget::loadupLayout()
{
    //对Widget进行Layout
    QWidget* pWidget=new QWidget(this);
    QHBoxLayout* pLayout=new QHBoxLayout(pWidget);

    //可以设置内容的一些边界啥的格式
    pLayout->setContentsMargins(0,20,0,20);
    pLayout->setSpacing(20);

    QLabel* pNameLabel=new QLabel(tr("用户登录系统"),pWidget);
    pNameLabel->setToolTip("This is a 用户登录系统.");
    pNameLabel->setObjectName("name");
    pNameLabel->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);//水平和垂直方向的布局

    pLayout->addWidget(pNameLabel,0,Qt::AlignHCenter); //0表示延伸
    pWidget->setLayout(pLayout);

    return pWidget;
}
//tr()用于各种形式的字符串转换的

QWidget* Widget::loadmidLayout()
{
    //对Widget进行Layout
    QWidget* pWidget=new QWidget(this);
    QGridLayout* pLayout=new QGridLayout(pWidget);

    //可以设置内容的一些边界啥的格式
    pLayout->setContentsMargins(30,20,10,10);
    pLayout->setHorizontalSpacing(5);
    pLayout->setVerticalSpacing(20); //竖直方向给20

    QLabel* pUserNameLabel=new QLabel(tr("用户名"));
    m_pUsernameLE=new QLineEdit();
    m_pUsernameLE->setObjectName("user_name");
    m_pUsernameLE->setMaxLength(20);//支持的最长输入
    m_pUsernameLE->setText("");
    m_pUsernameLE->setFocusPolicy(Qt::StrongFocus);

    pLayout->addWidget(pUserNameLabel,0,0);
    pLayout->addWidget(m_pUsernameLE,0,1,1,3);

    QLabel* pPasswordLabel=new QLabel(tr("密码"));
    m_pPasswordLE=new QLineEdit();
    m_pPasswordLE->setObjectName("password");
    m_pPasswordLE->setMaxLength(16);//支持的最长输入
    m_pPasswordLE->setEchoMode(QLineEdit::Password);
    m_pPasswordLE->setText("");
    // m_pPasswordLE->setFocusPolicy(Qt::NoFocus);
    pLayout->addWidget(pPasswordLabel,1,0);
    pLayout->addWidget(m_pPasswordLE,1,1,1,3);

    m_pRememberCB= new QCheckBox(tr("记住密码"));
    m_pRememberCB->setChecked(true);
    m_pRememberCB->setFocusPolicy(Qt::NoFocus);

    m_pAutoLoginCB= new QCheckBox(tr("自动登录"));
    m_pAutoLoginCB->setChecked(true);
    pLayout->addWidget(m_pRememberCB,2,0,1,2);
    pLayout->addWidget(m_pAutoLoginCB,2,2,1,1);

    pWidget->setLayout(pLayout);

    return pWidget;
}

QWidget* Widget::loaddownLayout()
{
    QWidget* pWidget=new QWidget(this);
    QHBoxLayout* pLayout=new QHBoxLayout(pWidget); //水平布局
    //可以设置内容的一些边界啥的格式
    pLayout->setContentsMargins(0,0,0,10);

    QPushButton* pLoginButton=new QPushButton(tr("登录"));
    pLoginButton->setObjectName("login_btn");
    pLoginButton->setFocusPolicy(Qt::NoFocus);
    pLoginButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);

    QPushButton* pCancelButton=new QPushButton(tr("取消"));
    pCancelButton->setObjectName("cancel_btn");
    pCancelButton->setFocusPolicy(Qt::NoFocus);
    pCancelButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);

    pLayout->addWidget(pLoginButton);
    pLayout->addWidget(pCancelButton);

    pWidget->setLayout(pLayout);

    return pWidget;
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include<QDialog>
#include<QCheckBox>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class QLineEdit;
class QCheckBox;

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    void setupLayout();
    QWidget* loadupLayout();
    QWidget* loadmidLayout();
    QWidget* loaddownLayout();

private:
    Ui::Widget *ui;
    QLineEdit *m_pUsernameLE; //命名的时候,m表示成员变量,p表示指针,LE是LineEdit的缩写
    QLineEdit *m_pPasswordLE;
    QCheckBox *m_pRememberCB;
    QCheckBox *m_pAutoLoginCB;
};
#endif // WIDGET_H

这里补充一点:

setFocusPolicy()

如果该小部件或具父级之一是活动窗口,则将键盘输入焦点设置为该小部件或其焦点代理),reason参数将传递到从此函数发送的任何焦点事件中,它用于说明是什么原因导致小部件获很焦点。如果窗口不活动,则在窗口变为活动状态时将焦点放在小部件上。

首先,将焦点改变事件发送到焦点小部件如果有),告诉它即将失去焦点,然后更改焦点,将焦点移出事件发送到前一个焦点项,并将焦点进入事件发送到新项目,告诉它刚刚接收到佛点。 (如果焦点输入和焦点输出小部件相同,则不会发生任何事情。)

注意:在嵌入式平台上,setFocus()不会使输入法打开输入面板。如果希望这样做,必须自己向小部件发送QEvent::RequestSoftwareInputPanel事件。

setFocus() 无论小部件的焦点策略如何,都会将焦点设置为小部件,但不清除任何键盘抢占( 参见grabKeyboard() )。

请注意,如果小部件被隐藏,则在显示之前它将不会接受焦点

警告: 如果在可能从focusOutEvent() 或 focusInEvent() 调用它自己的函数中调用 setFocus() ,可能会出现无限递归.

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

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

相关文章

计算机设计大赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

excel怎么设置密码?轻松保护您的工作表

在数字化时代&#xff0c;数据的安全性显得尤为重要。excel作为我们日常工作中广泛使用的办公软件&#xff0c;其中可能包含了大量的敏感数据。为了确保这些数据不被未授权的人访问&#xff0c;本文将为您详细介绍excel怎么设置密码&#xff0c;从而有效地保护您的数据安全。 方…

STM32F407ZGT6——实验9-4 通用定时器脉冲计数实验

一、配置路线 二、问题及反思 配置的时候误以为需要先把【输入捕获配置】了再去配置【从模式】&#xff0c;后面验证了这样配置没办法产生预期的效果。 代码如下&#xff1a;void gtim_timx_cnt_chy_init(uint16_t psc, uint16_t arr) void gtim_timx_cnt_chy_init(uint16_t…

全新魅思V20正规视频影视系统源码/APP+H5视频影视源码

全新魅思V20正规视频影视系统源码&#xff0c;APPH5视频影视源码。会员花费三千购入的&#xff0c;具体搭建教程放压缩包了&#xff01; 有兴趣的下载自行研究吧&#xff0c;搭建一共要用到3个域名&#xff0c;可以拿二级域名搭建。

企业级大模型的护城河:RAG + 微调

围绕LLM的炒作是前所未有的&#xff0c;但这是有道理的&#xff0c;生成式 AI 有潜力改变我们所知道的社会。 在很多方面&#xff0c;LLM将使数据工程师变得更有价值——这令人兴奋&#xff01; 不过&#xff0c;向老板展示数据发现工具或文本到 SQL 生成器的炫酷演示是一回事…

解密数据清洗,SQL中的数据分析

大家好&#xff0c;数据库表中的数据经常会很杂乱。数据可能包含缺失值、重复记录、异常值、不一致的数据输入等&#xff0c;在使用SQL进行分析之前清洗数据是非常重要的。 当学习SQL时&#xff0c;可以随意地创建数据库表&#xff0c;更改它们&#xff0c;根据需要更新和删除…

云原生 k8s 可能使用到的端口整理【不定期更新】

k8s 因为涉及到的组件太多了&#xff0c;所以端口有很多&#xff0c;这里整理了日常所接触的接口&#xff0c;后续有新的再更新。 如果是通过公网 IP 进行安装的时候需要根据实际情况有选择的进行放开&#xff1b;一般只有云厂商会提供公网 IP 访问&#xff0c;自建的话不建议 …

GrayLog踩坑历险记

背景 GrayLog作为ELK的替代产品&#xff0c;是新生代的日志采集框架。在一个采集节点日志的需求中&#xff0c;因为节点很多&#xff0c;产生的日志也很多&#xff0c;因此尝试了使用GrayLog进行日志的采集。下面记录一下使用GrayLog中遇到的坑和解决方案。 一、部署与启动 …

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#xff1b;2&#xff09;目标检测、语义分割、OCR、分类等技术孵化&#xff0c;赋能智能制造&#xff0c;工业项目落地经验丰富&#xff1b; …

鸿蒙南向开发——GN快速入门指南

运行GN(Generate Ninja) 运行gn&#xff0c;你只需从命令行运行gn&#xff0c;对于大型项目&#xff0c;GN是与源码一起的。 对于Chromium和基于Chromium的项目&#xff0c;有一个在depot_tools中的脚本&#xff0c;它需要加入到你的PATH环境变量中。该脚本将在包含当前目录的…

空间数据分析和空间统计工具库PySAL入门

空间数据分析是指利用地理信息系统(GIS)技术和空间统计学等方法&#xff0c;对空间数据进行处理、分析和可视化&#xff0c;以揭示数据之间的空间关系和趋势性&#xff0c;为决策者提供有效的空间决策支持。空间数据分析已经被广泛运用在城市规划、交通管理、环境保护、农业种植…

主从数据库MySQL服务重启步骤与注意事项

主从数据库MySQL服务重启步骤与注意事项 实验环境&#xff1a; 172.20.26.34 &#xff08;主应用服务器&#xff09; 172.20.26.26 &#xff08;备应用服务器&#xff09; 172.20.26.37 &#xff08;主库服务器&#xff09; 172.20.26.38 &#xff08;从库服务器&…

Spring Boot 中使用 Spring MVC基础

Spring MVC基础 一、控制器 controller1.定制控制器的方法&#xff08;1&#xff09;接收请求&#xff08;2&#xff09;接收请求参数&#xff08;3&#xff09;返回值 二、模型 Modle三、视图 View四、总结 Spring MVC 是非常著名的 Web 应用框架&#xff0c;现在的大多数 Web…

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑&#xff0c;开发者选项中打开 USB 调试。&#xff08;开发者选项默认隐藏&#xff0c;需要在关于手机中多次点击版本号才能调出&#xff09;。 安装手机驱动&#xff0c;下载安装 ADB 工具包。 开始操作…

Excel得到JSON串

很多时候业务都需要做一种从Excel读取或者导入数据的功能&#xff0c;这在cs程序比较简单&#xff0c;在BS程序上如果封装不好的话那么写起来还是很费劲的&#xff0c;这次封装Excel读取操作。 先看使用 对&#xff0c;你没有看错&#xff0c;就是这么简单。 封装 基础设计…

TensorFlow2实战-系列教程11:RNN文本分类3

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 6、构建训练数据 所有的输入样本必须都是相同shape&#xff08;文本长度&#xff0c;…

Prometheus基于pod部署

1、kube-api的自动发现&#xff1a;Prometheus的容器化部署&#xff08;生产中都是pod部署&#xff09; 2、部署export &#xff08;1&#xff09;创建目录 &#xff08;2&#xff09;创建命名空间 &#xff08;3&#xff09;部署node-export ①9100端口被占用&#xff0c;停…

useEffect的第二个参数

目录 1、第一个参数&#xff1a; 2、第二个参数&#xff1a; 2.1 不传值&#xff1a;无限循环 2.2 空数组作为依赖&#xff1a;执行一次 2.3 基本类型作为依赖&#xff1a;无限循环 2.4 引用类型 2.4.1 数组作为依赖&#xff1a;无限循环 2.4.2 函数作为依赖&#…

添加了gateway之后远程调用失败

前端提示500&#xff0c;后端提示[400 ] during [GET] to [http://userservice/user/1] 原因是这个&#xff0c;因为在请求地址写了两个参数&#xff0c;实际上只传了一个参数 解决方案&#xff1a;加上(required false)并重启所有相关服务

Redis(十)SpringBoot集成Redis

文章目录 连接单机mvnYMLController.javaRedisConfig.java 连接集群YML问题复现 RedisTemplate方式 连接单机 mvn <!--Redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</art…