当前位置: 首页 > news >正文

QT之LayOut布局

文章目录

  • QFormLayout
  • QGridLayout
  • QFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例
    • 用QFormLayout 代替 界面左边部分的QGridLayout

QFormLayout

#include "widget.h"#include <QFormLayout>
#include <QLineEdit>Widget::Widget(QWidget *parent): QWidget(parent)
{//固定窗口大小setFixedSize(250,200);// 创建表单布局指针QFormLayout *qLayout=new QFormLayout(this);QLineEdit *le1=new QLineEdit(); // 输入学号QLineEdit *le2=new QLineEdit(); // 输入姓名QLineEdit *le3=new QLineEdit(); // 输入学校qLayout->addRow("学号",le1);qLayout->addRow("姓名",le2);qLayout->addRow("学校",le3);qLayout->setSpacing(10);// WrapAllRows将标签显示在单行编辑框上面//qLayout->setRowWrapPolicy(QFormLayout::WrapAllRows);// 当标签和单选编辑框,将标签显示在同一行。qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);qLayout->setLabelAlignment(Qt::AlignLeft); // 设置标签对齐方式setWindowTitle("表单布局测试案例");}

qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);效果
在这里插入图片描述
qLayout->setRowWrapPolicy(QFormLayout::WrapAllRows);效果
在这里插入图片描述

QGridLayout

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{button1=new QPushButton(this);button1->setText("第一区:顶部菜单栏选项");//button1->setFixedHeight(60); // 设置固定大小高度//把QPushButton控件的大小策略设定为在水平和垂直方向上都能自动扩展。//当窗口大小发生改变时,按钮能够依据布局的变化自动调整自身大小button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button2=new QPushButton(this);button2->setText("第二区:侧边栏选项");//button2->setFixedWidth(150); // 设置固定大小宽度button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button3=new QPushButton(this);button3->setText("第三区:底部选项");//button3->setFixedHeight(60);button3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button4=new QPushButton(this);button4->setText("第四区:子窗体选项");//button4->setFixedHeight(60);button4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);//网格布局类pGrid_layouts=new QGridLayout();// 通过此函数设置左侧 顶部 右侧 底部边距,主要方便布局周围进行使用pGrid_layouts->setContentsMargins(0,0,0,0);// 用于设置布局四周的边距// pGrid_layouts->setMargin(30);//5.12开始被弃用pGrid_layouts->setContentsMargins(10,10,10,10);//设置QGridLayout中各个控件之间间距pGrid_layouts->setSpacing(0);// 显示位置// addWidget(参数1,参数2,参数3,参数4,参数5,参数6)/*1:我要插入的子布局对象2:插入的开始行3:插入的开始列4:占用的行数5:占用的列数6:指定对齐方式*/pGrid_layouts->addWidget(button1,0,1);pGrid_layouts->addWidget(button2,0,0,3,1);pGrid_layouts->addWidget(button3,2,1);pGrid_layouts->addWidget(button4,1,1);//给部件设置布局setLayout(pGrid_layouts);}

在这里插入图片描述
第一区:第0行、第1列
第二区:第0行、第0列、占用3行,1列
第三区:第1行、第1列
第四区:第2行、第1列

QFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private:// 1:左边 网格布局、表格布局QGridLayout *lLayout;QLabel *UserNumber;QLineEdit *UserNumberLineEdit;QLabel *UserName;QLineEdit *UserNameLineEdit;QLabel *UserSex;QComboBox *UserSexCombobox;QLabel *UserDepart;QTextEdit *UserDepartTextEdit;QLabel *UserAge;QLineEdit *UserAgeLineEdit;// 2:右边 水平布局QHBoxLayout *toprightlayout;QVBoxLayout *rightlayout;QLabel *MyselfInfo;QTextEdit *MyselfInfoTextEdit;// 3:右边底部QPushButton *okbutton,*cancelbutton;QHBoxLayout *buttomLayout;
};
#include "dialog.h"
#include <QFormLayout>Dialog::Dialog(QWidget *parent): QDialog(parent)
{setWindowTitle("员工信息");// 左边控件UserNumber=new QLabel("员工编号:");UserNumberLineEdit=new QLineEdit;UserName=new QLabel("员工姓名:");UserNameLineEdit=new QLineEdit;UserSex=new QLabel("员工性别:");UserSexCombobox=new QComboBox;UserSexCombobox->addItem("男");UserSexCombobox->addItem("女");UserDepart=new QLabel("所在部门:");UserDepartTextEdit=new QTextEdit;UserAge=new QLabel("员工年龄:");UserAgeLineEdit=new QLineEdit;// 网格布局lLayout=new QGridLayout();// addWidget(参数1,参数2,参数3,参数4,参数5,参数6)/*1:我要插入的子布局对象2:插入的开始行3:插入的开始列4:占用的行数5:占用的列数6:指定对齐方式*/lLayout->addWidget(UserNumber,0,0); // 员工编号lLayout->addWidget(UserNumberLineEdit,0,1);lLayout->addWidget(UserName,1,0);lLayout->addWidget(UserNameLineEdit,1,1);lLayout->addWidget(UserSex,2,0);lLayout->addWidget(UserSexCombobox,2,1);lLayout->addWidget(UserDepart,3,0);lLayout->addWidget(UserDepartTextEdit,3,1);lLayout->addWidget(UserAge,4,0);lLayout->addWidget(UserAgeLineEdit,4,1);//设置网格布局(QGridLayout)列拉伸系数的方法//有两列,拉伸系数分别为 1 和 3,那么第二列将获得比第一列多两倍的额外空间。lLayout->setColumnStretch(0,1);lLayout->setColumnStretch(1,3);// 右边上部分//右边为垂直布局里个人简历为垂直布局,其他信息为水平布局toprightlayout=new QHBoxLayout();toprightlayout->setSpacing(5);MyselfInfo=new QLabel("个人简历:");MyselfInfoTextEdit=new QTextEdit;QLabel* MyselfInfo1=new QLabel("其他信息:");QTextEdit* MyselfInfoTextEdit1=new QTextEdit;//个人简历加到垂直布局toprightlayout->addWidget(MyselfInfo1);toprightlayout->addWidget(MyselfInfoTextEdit1);rightlayout=new QVBoxLayout();//把水平布局放进主界面右边的垂直布局rightlayout->addWidget(MyselfInfo);//把其他信息放进水平布局rightlayout->addWidget(MyselfInfoTextEdit);rightlayout->addLayout(toprightlayout);// 右边下部分okbutton=new QPushButton("确认");cancelbutton=new QPushButton("退出");buttomLayout=new QHBoxLayout();buttomLayout->addStretch();buttomLayout->addWidget(okbutton);buttomLayout->addWidget(cancelbutton);QGridLayout *mlayout=new QGridLayout(this);//隐式设置Dialog的布局为mlayoutmlayout->setMargin(20);mlayout->setSpacing(10);mlayout->addLayout(lLayout,0,0); // 左边//mlayout->addLayout(qLayout,0,0);mlayout->addLayout(rightlayout,0,1); // 右上mlayout->addLayout(buttomLayout,1,0,1,2);//窗口会根据布局里内容的尺寸来自动调整初始大小,并且用户无法对窗口大小进行更改mlayout->setSizeConstraint(QLayout::SetFixedSize);//new QGridLayout(this);这里不隐式设定布局就要显示设置setLayout(mlayout);//不然界面无法显示//setLayout(mlayout);}

用QFormLayout 代替 界面左边部分的QGridLayout

#include "dialog.h"
#include <QFormLayout>Dialog::Dialog(QWidget *parent): QDialog(parent)
{setWindowTitle("员工信息");/*****QFormLayout *qLayout=new QFormLayout(this);// 隐式设置Dialog的布局为qLayout错误这里如果传了this就会把qLayout设置为定成布局,就只会显示qLayout的界面*****///Qt规则​​:当通过 new QLayout(widget) 创建布局时,会自动调用 widget->setLayout()//​​后果​​:Dialog 的布局被先后设置为 qLayout 和 mlayout,违反 ​​单顶级布局原则​QFormLayout *qLayout=new QFormLayout();QLineEdit *le1=new QLineEdit(); // 员工编号:QComboBox *le2=new QComboBox(); // 员工姓名:le2->addItem("男");le2->addItem("女");QLineEdit *le3=new QLineEdit(); // 员工性别:QTextEdit *le4=new QTextEdit(); // 所在部门:QLineEdit *le5=new QLineEdit(); // 员工年龄:qLayout->addRow("员工编号:",le1);qLayout->addRow("员工姓名:",le2);qLayout->addRow("员工性别:",le3);qLayout->addRow("所在部门:",le4);qLayout->addRow("员工年龄:",le5);qLayout->setSpacing(10);qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);qLayout->setLabelAlignment(Qt::AlignLeft); // 设置标签对齐方式// 右边上部分toprightlayout=new QHBoxLayout();toprightlayout->setSpacing(5);MyselfInfo=new QLabel("个人简历:");MyselfInfoTextEdit=new QTextEdit;QLabel* MyselfInfo1=new QLabel("其他信息:");QTextEdit* MyselfInfoTextEdit1=new QTextEdit;toprightlayout->addWidget(MyselfInfo1);toprightlayout->addWidget(MyselfInfoTextEdit1);rightlayout=new QVBoxLayout();rightlayout->addWidget(MyselfInfo);rightlayout->addWidget(MyselfInfoTextEdit);rightlayout->addLayout(toprightlayout);// 右边下部分okbutton=new QPushButton("确认");cancelbutton=new QPushButton("退出");buttomLayout=new QHBoxLayout();buttomLayout->addStretch();buttomLayout->addWidget(okbutton);buttomLayout->addWidget(cancelbutton);QGridLayout *mlayout=new QGridLayout(this);//隐式设置Dialog的布局为mlayoutmlayout->setMargin(20);mlayout->setSpacing(10);//mlayout->addLayout(lLayout,0,0); // 左边mlayout->addLayout(qLayout,0,0);mlayout->addLayout(rightlayout,0,1); // 右上mlayout->addLayout(buttomLayout,1,0,1,2);//窗口会根据布局里内容的尺寸来自动调整初始大小,并且用户无法对窗口大小进行更改mlayout->setSizeConstraint(QLayout::SetFixedSize);//setLayout(mlayout);}

两个显示效果都是这个

在这里插入图片描述

相关文章:

  • MCP LLM Bridge:连接Model Context Protocol与OpenAI兼容LLM的桥梁
  • (4)python爬虫--JsonPath
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.7)
  • 如何在前端页面上展示解析后的 JSON 数据?
  • DeepSeek 赋能量子计算:突破与未来图景
  • CoverM:contig/bin的相对丰度计算
  • 思路收集文档
  • 高频面试题(含笔试高频算法整理)基本总结回顾61
  • 2.单链表两数相加(java)
  • SpringBoot--自动配置原理详解
  • 从专家编码到神经网络学习:DTM 的符号操作新范式
  • FauxGen:一款由 CodeBuddy 主动构建的假数据生成器
  • 【算法】分支限界法和贪心、动态规划、回溯、分治法的区别是
  • 强化学习笔记(一)基本概念
  • 多模态学习(三)—— ROPE位置编码:从理论到实践
  • 文字溢出省略号显示
  • React 中,闭包陷阱
  • 8天Python从入门到精通【itheima】-14~16
  • 10 分钟打造一款超级马里奥小游戏,重拾20 年前的乐趣
  • Baklib知识中台构建企业智能服务新引擎
  • 蒲慕明院士:未来数十年不是AI取代人,而是会用AI的人取代不会用的
  • 泽连斯基:俄代表团级别低,没人能做决定
  • 外交部部长助理兼礼宾司司长洪磊接受美国新任驻华大使递交国书副本
  • 金融月评|尽早增强政策力度、调整施策点
  • 新闻1+1丨城市,如何对青年更友好?
  • 颜福庆与顾临的争论:1930年代在中国维持一家医学院要花多少钱