qt之页面布局

2023-11-06

QTlayout概述

 

Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件,确保它们有效地使用空间。Qt包含了一组布局管理类,从而在应用程序的用户界面中对部件进行布局,比如QLayout的几个子类,这里将它们称作布局管理器。所有QWidget的子类的实例(对象)都可以使用布局管理器管理位于它们之中的子部件,QWidget : ; setLay-out()函数可以在一个部件上应用布局管理器。一旦一个部件上设置了布局管理器,那么它会完成以下几种任务:

(1)定位子部件

(2)感知窗口默认大小

(3)感知窗口最小大小

(4)窗口大小变化进行处理

(5)当内容改变时进行处理

----字体大小、文本、或者子部件

-----隐藏或显示子部件

----移除子部件

布局管理器

QLayout类是布局管理器的基类,是一个抽象基类,继承自QObject 和 QLayou-tItem类,QLayoutItem类提供了一个供QLayout操作的抽象项目。QLayout和QLayoutItem都是在设计自己的布局管理器时才使用的,一般只需要使用QLayout的几个子类即可,它们分别是QBoxLayout(基本布局管理器).QGridLayout(栅格布局管理器),QFormLayout(窗体布局管理器)和QStackedLayout(栈布局管理器)。

基本布局管理器

基本布局管理器QBoxLayout类可以使子部件在水平方向或者垂直方向排成一列,它将所有的空间分成一行盒子,然后将每个部件放入一个盒子中。它有两个子类QHBoxLayout水平布局管理器和QVBoxLayout垂直布局管理器,编程中经常用到。再回到设计模式中看看布局管理器的属性。先单击主界面,查看它的属性栏,最后面的部分是其使用的布局管理器的属性

     QHBoxLayout *layout = new QHBoxLayout;      // 新建水平布局管理器
        layout->addWidget(ui->fontComboBox);        // 向布局管理器中添加部件
        layout->addWidget(ui->textEdit);
        layout->setSpacing(50);                     // 设置部件间的间隔
        layout->setContentsMargins(0, 0, 50, 100);  // 设置布局管理器到边界的距离
                                                    // 四个参数顺序是左,上,右,下
        setLayout(layout);                          // 将这个布局设置为MyWidget类的布局

QGridLayout

栅格布局管理器QGridLayout类使部件在网格中进行布局,它将所有的空间分隔成一些行和列,行和列的交叉处形成了单元格,然后将部件放入一个确定的单元格中。先往界面上拖放一个Push Button,然后在mywidget. cpp中添加头文件#include<QGridLayout≥,再注释掉前面添加的关于水平布局管理器的代码,添加的如下

    QGridLayout *layout = new QGridLayout;
        // 添加部件,从第0行0列开始,占据1行2列
        layout->addWidget(ui->fontComboBox, 0, 0, 1, 2);
        // 添加部件,从第0行2列开始,占据1行1列
        layout->addWidget(ui->pushButton, 0, 2, 1, 1);
        // 添加部件,从第1行0列开始,占据1行3列
        layout->addWidget(ui->textEdit, 1, 0, 1, 3);
        setLayout(layout);

这里主要是设置部件在栅格布局管理器中的位置,将fontComboBox部件设置为占据1行2列,而pushButton部件占据1行1列,这主要是为了将fontComboBox部件和 pushButton部件的长度设置为2+1。这样一来,textEdit部件要想占满剩下的空间,就要使它的跨度为3列。这里需要说明,当部件加入到一个布局管理器中,然后将这个布局管理器再放到一个窗口部件上时,这个布局管理器以及它包含的所有部件都会自动重新定义自己的父对象( parent)为这个窗口部件,所以在创建布局管理器和其中的部件时并不用指定父部件。

窗体布局器

窗体布局管理器QFormLayout类用来管理表单的输人部件以及与它们相关的标签。窗体布局管理器将它的子部件分为两列,左边是一些标签,右边是一些输入部件,比如行编辑器或者数字选择框等。其实,如果只是起到这样的布局作用,那么用QGridLayout就完全可以做到了,之所以添加QFormLayout类,是因为它有独特的功能。

Vertical Spacer

产生间隔,将它放在窗体布局管理器与水平布局管理器之间。最后单击主界面并按下Ctrl+L快捷键,让整个界面处于一个垂直布局管理器中。这时可以在右上角的对象列表中选择分隔符Spacer,然后在属性栏中设置它的高度为100,如图4-3所示。这时运行程序可以看到,分隔符是不显示的。

设置部位大小

讲解之前要先了解两个概念:大小提示( sizeHint)和最小大小提示(minimumSize-Hint)。凡是继承自QWidget的类都有这两个属性,其中, sizeHint属性保存了部件的建议大小,对于不同的部件,默认拥有不同的 sizeHint;而 minimumSizeHint保存了一个建议的最小大小提示。可以在程序中使用sizeHint()函数来获取sizeHint的值,使用minimumSizeHint()函数获取 minimumSizeHint的值。需要说明的是,如果使用setMinimumSize()函数设置了部件的最小大小,那么最小大小提示将会被忽略。这两个属性在使用布局时起到了很重要的作用。

伸缩因子

前面讲垂直布局管理器时曾提到过它,其实它是用来设置部件间比例的。界面上的字体选择框和一个按钮处于一个水平布局管理器中,现在想让它们的宽度比例为2:1,那么就可以单击对象栏中的horizontalLayout水平布局管理器对象,然后在它的属性栏中将layoutStretch 属性设置为“2,1”,这样这个水平布局管理器中的两个部件的宽度就是2:1的比例了。如果要在代码中进行设置,则可以在使用布局管理器的add Widget()函数添加部件的同时,在第二个参数中指定伸缩因子。

可拓展窗口

一个窗口可能有很多选项是扩充的,只有在必要的时候才显示出来,这时就可以使用一个按钮来隐藏或者显示多余的内容,就是所谓的可扩展窗口。要实现可扩展窗口,就要得力于布局管理器的特性,那就是当子部件隐藏时,布局管理器自动缩小,当子部件重新显示时,布局管理器再次放大。

实战总结

效果图

 1.可拓展窗口如何实现

应用信号与槽

先检测 checkable 应用信号 toggled(bool)

 代码:

void Widget::on_pushButton_toggled(bool checked)
{
    ui->textEdit->setVisible(checked);
    if(checked)ui->pushButton->setText(tr("可隐藏效果"));
    else ui->pushButton->setText(tr("显示可拓展窗口"));

}

 2.为什么年龄那一行长度不统一

 选中expandingfieldjiuxing啦 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt之页面布局 的相关文章

  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这
  • 将 UTC 格式的 QDateTime 转换为本地系统时间

    我从这样的字符串构造 QDateTime QDateTime date QDateTime fromString 2010 10 25T10 28 58 570Z yyyy MM ddTHH mm ss zzzZ 我知道date是 UTC
  • 使用嵌入qt的mysql?

    我正在尝试使用嵌入 QT 的 mysql 我已经有一个与 mysqld 链接的 Qt mysql 插件 该插件可以很好地加载嵌入式数据库 但 QT 没有简单的方法来设置 dataDir 等嵌入式选项 我在这里看到 http doc qt i
  • 如何在 Qt-Creator 中添加自定义构建步骤?

    构建我的应用程序后 我想将其复制到特定目录 在 Windows 7 上 自定义构建步骤 cmd exe c k copy MyPlugin dll HostApp Debug plugins 但我有错误 Can t run process
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • PyQt:如何通过匿名代理使用网页

    这真让我抓狂 我想在 QWebPage 中显示一个 url 但我想通过匿名代理来实现 Code setting up the proxy proxy QNetworkProxy proxy setHostName 189 75 98 199
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目
  • QWebView等待加载

    bool MainWindow waitForLoad QWebView view QEventLoop loopLoad QTimer timer QObject connect view SIGNAL loadFinished bool
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图

随机推荐

  • 成功解决OSError: Looks like you do not have git-lfs installed, please install. 【没有root权限】

    成功解决OSError Looks like you do not have git lfs installed please install You can install from http 问题描述 什么是git LFS 解决方案 没
  • 算法提高(VIP)——最长公共子序列

    题目描述 给定两个字符串 寻找这两个字串之间的最长公共子序列 输入格式 输入两行 分别包含一个字符串 仅含有小写字母 输出格式 最长公共子序列的长度 样例输入 abcdgh aedfhb 样例输出 3 题解 动态规划 f i j 集合 所有
  • visio导出高质量图片

    具体操作如下 首先 ctrl A 然后选择 另存为 保存类型选择 Tag图像文件格式 接着在输出里面设置 压缩格式选为 LZW 接着是 256色 然后选择 打印机 下面是 源 然后点击确定就可以了 这样绝对是满足投稿要求的 分辨率为300d
  • 使用jQuery ajax解决mailchimp注册表单二次跳转问题

    当我们在mailchimp后台创建好表单之后 将表单html复制到我们的网站 我们发现 在提交表单时会再次跳转到一个mailchimp表单提交页面 且无法控制表单提交成功之后的逻辑 如果我们能做到自己提交表单异步请求 然后就能控制mailc
  • ubuntu unable to connect to rdp server

    今天早上开机 远程连接win 提示unable to connect to rdp server 昨天还好好的 怎么今天突然不行了 telnet win 的3389端口 是通的 用remina remote desktop client 连
  • linux基础之用户和用户组

    目录 一 用户 1 用户文件 2 查看用户时 cy x 1000 1000 cy home cy bin bash 3 useradd 添加用户 4 passwd 修改密码 要到root用户下 5 su 切换用户 6 userdel 删除用
  • c语言---字符串为什么不能修改内容???字符串常量存放在常量区吗???

    疑惑 1 const修饰的变量都存放在常量区吗 2 字符串常量存放在那 为什么字符型指针 char 指向字符串不能修改其内容 字符串的演变 char p 123456 123456 常量字符串 char static const char
  • Linux专栏的卷首语

    2023年5月15日 周一早上 昨天我决定为了找工作而开始深入学习Linux 于是今天早上开一个Linux专栏来记录我的学习记录 之前我因为感兴趣曾经学习过一段时间的Linux 之前因为看不到学习Linux的好处而放弃了对Linux的学习
  • 神经网络学习小记录45——Keras常用学习率下降方式汇总

    神经网络学习小记录45 Keras常用学习率下降方式汇总 2020年5月19日更新 前言 为什么要调控学习率 下降方式汇总 1 阶层性下降 2 指数型下降 3 余弦退火衰减 4 余弦退火衰减更新版 2020年5月19日更新 增加了论文中的余
  • JVM性能调优实战

    JVM调优调什么 JVM 调优是一个系统而又复杂的过程 但我们知道 在大多数情况下 我们基本不用去调整 JVM 内存分配 因为一些初始化的参数已经可以保证应用服务正常稳定地工作了 而且一般情况下 就算出现了 也是架构师级别的去处理 实际上
  • c++ to_string、stoi()、atoi()使用

    1 to string 包含在 include
  • SQL连续登录4天及以上的用户

    需求 连续登录4天及以上的用户 有一个表login test 求出连续登录4天及以上的用户 方法一 排序窗口函数 row number select row number over partition by user id order by
  • 探讨linux进程的三种时间(real time, system cpu time, user cpu time)的实现

    APUE 3 9节中关于系统调用read给出了不同大小的缓冲区会导致读取效率的差异 这里stevens用三种时间表示读取文件过程所花费的时间 这三种时间分别为真实 时钟时间 real clock time 系统cpu时间 system cp
  • 前端知识学习

    以下是一个使用Angular 13实现的示例代码 实现了当div出现滚动条时给div底部加上阴影效果 并随着滚动条的拖动保留阴影效果 当滚动条拉到最后时 阴影效果消失 首先 在你的组件的HTML模板中添加以下代码 div class con
  • 最适合初学者使用的react框架—UMI.js

    介绍 最近接触到了一个新的react框架 大大省略了我开发的时间 而且学起来和上手都挺容易的 但论坛上关于这个框架的介绍并不多 我就大概介绍一下这个框架并写一些使用心得 1 什么是umi 它是由dva的开发者云谦编写的一个新的React开发
  • 以太坊存储分析(整合)

    分析背景及概述 更加深入地了解以太坊的内部存储机制 更好地实现自己的区块链 存储是一个不能缺少的模块 但是存储又不是单一的数据保存 它涉及到了以太坊核心的编码 数据结构 中间还有缓存的部分 最后才通过leveldb 一种key value数
  • 若依tab权限问题

    普通的按钮直接用v hasPermi就可以了 但是这个有个问题 这个东西相当于v show 而像el tab pane就需要v if才能把标签头隐藏 所以需要以下代码 v if checkPermi xxx xxx xxx import c
  • Leetcode算法题:旋转数组问题(全)总结 思路+题解+代码

    旋转数组问题总结 标签 二分查找 翻转数组 笔者在刷LeetCode时多次遇到旋转数组问题 将其各类问题加以总结 从简入深整理出关于旋转数组的全部问题题解思路和代码 希望对读者有所帮助 题目 189 旋转数组 给定一个数组 将数组中的元素向
  • RuoYi -- 字典的前端调用

    前言 记录时间 2022 5 18 内容 字典可以实现枚举联动 前端怎么写去调用呢 我参考company之前项目里的 联赛赛事管理 部分 整理如下 主要包含html js的更新 备注 由于记录时并非边操作边记录 而是抽取往期代码加上自己的理
  • qt之页面布局

    QTlayout概述 Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件 确保它们有效地使用空间 Qt包含了一组布局管理类 从而在应用程序的用户界面中对部件进行布局 比如QLayout的几个子类 这里将它们称作布局管理器 所有QW