布局管理和样式表

目录

手动操作

相关功能解释:

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() ,可能会出现无限递归.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频怎么去掉人声保留背景声?这4个简单方法你一定要知道

视频怎么去掉人声保留背景声&#xff1f;在日常生活中&#xff0c;我们经常会遇到需要将视频中的声音去除&#xff0c;尤其是要去掉人声而保留背景声音。这不仅在处理个人视频时非常有用&#xff0c;对于许多专业的视频编辑工作来说也是必不可少的。本文将为你介绍4个简单的方法…

RabbitMQ入门概念

目录 一、RabbitMQ入门 1.1 rabbitmq是啥&#xff1f; 1.2 应用场景 1.3 AMQP协议与RabbitMQ工作流程 1.4 Docker安装部署RabbitMQ 二、SpringBoot连接MQ配置 2.1 示例1 2.1 示例2 —— 发送实体 一、RabbitMQ入门 1.1 rabbitmq是啥&#xff1f; MQ&#xff08;Message…

solidworks 焊接型材库

型材库中有大部分型材 H型钢有49种 八角钢有40种 扁钢有60种 不等边钢有84种 槽钢有41种 也可以按照自己需要的去添加 下载地址https://download.csdn.net/download/jintaihu/19347986

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

3671系列矢量网络分析仪

01 3671系列矢量网络分析仪 产品综述&#xff1a; 3671系列矢量网络分析仪产品包括3671C&#xff08;100kHz&#xff5e;14GHz&#xff09;、3671D&#xff08;100kHz&#xff5e;20GHz&#xff09;、3671E&#xff08;100kHz&#xff5e;26.5GHz&#xff09;、3671G&#x…

幻兽帕鲁服务器多少钱?幻兽帕鲁服务器价格,2月最新

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介 高级定时器的框图和通用定时器框图很类似&#xff0c;只是添加了其它的一些功能&#xff0c;如&#xff1a;重复计数器、带死区控制的互补输出通道、断路输入等。 高级定时器的时钟来自APB2, 而PCLK2 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 …

RTC实时时钟之读取时间

1. RTC 基本介绍 RTC(Real Time Clock) 即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 2. RTC 控制器 2.1 RTC的特点是:…

NC248:左叶子之和(C++)

1.题目描述 2.题目分析 我们以一个二叉树为例 左叶子的特点是什么&#xff1f; 是左节点并且没有左右孩子节点 所以我们用leftnode保存root->lefe节点&#xff0c;判断条件为leftnode存在&#xff0c;并且不存在leftnode->left和leftnode->right&#xff0c;如果满…

[力扣 Hot100]Day18 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 出处 思路 在原数组上直接操作势必会出现“冗余”的0&#xff0c;即原本[i,j]处不是0&#xff0c;例如由于i行的其他位置有0导致[i,j]…

Kali Linux初识

Kali Linux&#xff08;以前称为 BackTrack Linux&#xff09;是一个开源的、基于 Debian 的 Linux 发行版&#xff0c;旨在进行高级渗透测试和安全审计。它通过提供通用工具、配置和自动化来做到这一点&#xff0c;使用户能够专注于需要完成的任务。 包括 600 多种渗透测试工…

LeetCode 使循环数组所有元素相等的最少秒数

地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 难度&#xff1a;中等 题目描述&#xff1a;给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每…

【中关村开源生态论坛暨大模型智能应用技术大会】—— 探索AI和开源在未来的应用

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-9ttR7rpX3BzyF2C4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

任务悬赏系统搭建开发定制,任务分销系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、任务悬赏系统功能和运营方式 总结 前言 任务悬赏系统就是在小程序内可以做任务赚取佣金&#xff0c;这款系统主要针对手上有达人资源的用户可以冲一下这个项目…

(自用)learnOpenGL学习总结-高级OpenGL-几何着色器

在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点&#xff0c;在几何着色器中进行任意变换之后再给片段着色器&#xff0c;可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…

MySql 慢SQL配置,查询,处理

一.慢SQL配置相关 1.查看慢SQL是否开启 执行下面命令查看是否开启慢SQL show variables like %slow_query_log; 复制代码 OFF: 未开启ON: 2.打开慢SQL配置 执行下面的命令开启慢查询日志 set global slow_query_logON; 复制代码 3.修改慢查询阈值 前面介绍了SQL执行到达了…

Elasticsearch Windows版安装配置

Elasticsearch简介 Elasticsearch是一个开源的搜索文献的引擎&#xff0c;大概含义就是你通过Rest请求告诉它关键字&#xff0c;他给你返回对应的内容&#xff0c;就这么简单。 Elasticsearch封装了Lucene&#xff0c;Lucene是apache软件基金会一个开放源代码的全文检索引擎工…

已解决,引入外部文件,element-plus中的分页组件,当其位置在页面底部时,layout中的sizes(下拉框)始终向下弹出,且显示不完整,期望向上弹出

已解决&#xff1a;由于引入了外部样式&#xff0c;定位的问题导致的 解决办法&#xff1a; .el-select-dropdown {position: initial;margin: 0px;}排查问题的方法&#xff1a; 注释引入的外部文件&#xff0c;逐级排查问题所在&#xff0c;再新的css文件中重写样式&#xff…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

用 CanvasKit 实现超级丝滑的原神地图(已开源)!!!

首先给大家送上预览地址&#xff1a; 官网地址&#xff1a;https://webstatic.mihoyo.com/ys/app/interactive-map/index.html canvaskit地址&#xff1a;http://106.55.55.247/ky-genshin-map/ 为什么 canvaskit 有如此高的性能&#xff1f; 第一个问题&#xff0c;官方网页…