【QT】容器类控件

目录

概述

Group Box

核心属性 

Tab Widget

核心属性

核心信号

核心方法 

使用示例:

布局管理器

垂直布局

核心属性

使用示例:

水平布局

核⼼属性 (和 QVBoxLayout 属性是⼀致的)

网格布局

核心属性

使用示例:

示例: 设置水平拉伸系数

示例:设置垂直拉伸系数

表单布局

使用示例:

spacer

核心属性

使用示例:


概述

        所谓容器类控件就是可以容纳其他控件的控件。这与之前多元素控件不一样的地方是:多元素控件包含的内容,是一个一个自定义好的 ”Item“ 对象。而容器类控件,包含的内容是前面所介绍过的各种控件。

Group Box

使⽤ QGroupBox 实现⼀个带有标题的分组框. 可以把其他的控件放到⾥⾯作为⼀组. 这样看起来能更好看⼀点

核心属性 

属性说明
title
分组框的标题
alignment
分组框内部内容的对⻬⽅式
flat
是否是 "扁平" 模式
checkable
是否可选择.
设为 true, 则在 title 前⽅会多出⼀个可勾选的部分.
checked
描述分组框的选择状态 (前提是 checkable 为 true)

Tab Widget

使⽤ QTabWidget 实现⼀个带有标签⻚的控件, 可以往⾥⾯添加⼀些 widget. 进⼀步的就可以通过标签⻚来切换.

核心属性

属性方法
tabPosition
标签⻚所在的位置.
  • North 上⽅
  • South 下⽅
  • West 左侧
  • East 右侧
currentIndex
当前选中了第⼏个标签⻚ (从 0 开始计算)
currentTabText
当前选中的标签⻚的⽂本
currentTabName
当前选中的标签⻚的名字
currentTabIcon
当前选中的标签⻚的图标
currentTabToolTip
当前选中的标签⻚的提⽰信息
tabsCloseable
标签⻚是否可以关闭
movable
标签⻚是否可以移动

核心信号

属性说明
currentChanged(int)
在标签⻚发⽣切换时触发, 参数为被点击的选项卡编号
tabBarClicked(int)
在点击选项卡的标签条的时候触发. 参数为被点击的选项卡编号.
tabBarDoubleClicked(int)
在双击选项卡的标签条的时候触发. 参数为被点击的选项卡编号.
tabCloseRequest(int)
在标签⻚关闭时触发. 参数为被关闭的选项卡编号.

核心方法 

方法说明
count()
获取到标签⻚的个数
addTab
新增标签⻚
removeTab
删除标签⻚
currentIndex
获取到当前标签⻚的下标
setCurrentIndex
切换当前标签⻚

使用示例:

1. 添加新的标签页

    //获取当前有几个标签页了
    int count = ui->tabWidget->count();
    //创建新的widget
    QWidget* w = new QWidget();

    ui->tabWidget->addTab(w,QString("Tab")+QString::number(count+1));

2. 删除选中标签页

    int curIndex = ui->tabWidget->currentIndex();

    ui->tabWidget->removeTab(curIndex);

布局管理器

⼀个 widget 只能包含⼀个 layout.

垂直布局

使⽤ QVBoxLayout 表⽰垂直的布局管理器. V 是 vertical 的缩写

核心属性

属性说明
layoutLeftMargin
左侧边距
layoutRightMargin
右侧边距
layoutTopMargin
上⽅边距
layoutBottomMargin
下⽅边距
layoutSpacing
相邻元素之间的间距

使用示例:

   //创建三个按钮
   QPushButton* btn1 = new QPushButton("按钮1");
   QPushButton* btn2 = new QPushButton("按钮2");
   QPushButton* btn3 = new QPushButton("按钮3");

    //创建布局管理器
   QVBoxLayout* layout = new QVBoxLayout();
   layout->addWidget(btn1);
   layout->addWidget(btn2);
   layout->addWidget(btn3);

   //把布局管理器添加到窗口
   this->setLayout(layout);

 也可以选中要放入管理器的控件,如下:

最终效果:

水平布局

使⽤ QHBoxLayout 表⽰垂直的布局管理器. H 是 horizontal 的缩写.

核⼼属性 (和 QVBoxLayout 属性是⼀致的)

属性说明
layoutLeftMargin
左侧边距
layoutRightMargin
右侧边距
layoutTopMargin
上⽅边距
layoutBottomMargin
下⽅边距
layoutSpacing
相邻元素之间的间距

Layout ⾥⾯可以再嵌套上其他的 layout, 从⽽达到更复杂的布局效果;结合 QHBoxLayout QVBoxLayout , 就可以做出各种复杂的界⾯了。

网格布局

Qt 中还提供了 QGridLayout ⽤来实现⽹格布局的效果. 可以达到 M * N 的这种⽹格的效果.

核心属性

属性说明
layoutLeftMargin
左侧边距
layoutRightMargin
右侧边距
layoutTopMargin
上⽅边距
layoutBottomMargin
下⽅边距
layoutHorizontalSpacing
相邻元素之间⽔平⽅向的间距
layoutVerticalSpacing
相邻元素之间垂直⽅向的间距
layoutRowStretch
⾏⽅向的拉伸系数
layoutColumnStretch
列⽅向的拉伸系数

使用示例:

效果图:

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QGridLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton* btn1 = new QPushButton("按钮1");
    QPushButton* btn2 = new QPushButton("按钮2");
    QPushButton* btn3 = new QPushButton("按钮3");
    QPushButton* btn4 = new QPushButton("按钮4");

    QGridLayout* layout = new QGridLayout(this);
    layout->addWidget(btn1,0,0);
    layout->addWidget(btn2,0,1);
    layout->addWidget(btn3,1,0);
    layout->addWidget(btn4,1,1);
}

这里的addwidget的后两个参数是指定元素所在行号和列号 

当需要创建出尺寸不同的控件时,就可以通过拉伸系数来设置,拉伸系数就相当于设置控件之间尺寸的比例

示例: 设置水平拉伸系数

    layout->setColumnStretch(0,1);
    layout->setColumnStretch(1,2);

 如果拉伸系数为0(上述代码中的第二个参数),就是不参与拉伸,此时按钮的宽度是固定值

示例:设置垂直拉伸系数

 直接设置垂直拉伸系数是没有效果的,因为按钮垂直方向默认没有拉伸开(水平方向默认是拉伸的),因此垂直方向不会受到拉伸系数的影响了,需要设置SizePolicy。

使⽤ setSizePolicy 设置按钮的尺⼨策略. 可选的值如下:

  • QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。
  • QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值,布局时不会超过该值。
  • QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值,布局时不会⼩于该值
  • QSizePolicy::Preferred : 控件的理想尺⼨为固定值,布局时会尽量接近该值。
  • QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整,尽可能占据更多空间。
  • QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应空间。

 要想让垂直方向的拉伸系数生效,就需要让按钮能够拉伸展开,代码如下

btn1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

然后再设置垂直方向的拉伸系数即可。 

表单布局

除了上述的布局管理器之外, Qt 还提供了 QFormLayout , 属于是 QGridLayout 的特殊情况, 专
⻔⽤于实现两列表单的布局.
这种表单布局多⽤于让⽤⼾填写信息的场景. 左侧列为提⽰, 右侧列为输⼊框
  • 使⽤ addRow ⽅法来添加⼀⾏. 每⾏包含两个控件. 第⼀个控件固定是 QLabel / ⽂本, 第⼆个控件 则可以是任意控件.
  • 如果把第⼀个参数填写为 NULL, 则什么都不显⽰

使用示例:

    // 创建 layout
    QFormLayout* layout = new QFormLayout();
    this->setLayout(layout);
    // 创建三个 label
    QLabel* label1 = new QLabel("姓名");
    QLabel* label2 = new QLabel("年龄");
    QLabel* label3 = new QLabel("电话");
    // 创建三个 lineEdit
    QLineEdit* lineEdit1 = new QLineEdit();
    QLineEdit* lineEdit2 = new QLineEdit();
    QLineEdit* lineEdit3 = new QLineEdit();
    // 创建⼀个提交按钮
    QPushButton* btn = new QPushButton("提交");
    // 把上述元素添加到 layout 中
    layout->addRow(label1, lineEdit1);
    layout->addRow(label2, lineEdit2);
    layout->addRow(label3, lineEdit3);
    layout->addRow(NULL, btn);

spacer

使⽤布局管理器的时候, 可能需要在控件之间, 添加⼀段空⽩. 就可以使⽤ QSpacerItem 来表⽰.

核心属性

属性说明
width
宽度
height
⾼度
hData
⽔平⽅向的 sizePolicy
QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。
QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值,布局时不会超过该值。
QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值,布局时不会⼩于该值。
QSizePolicy::Preferred : 控件的理想尺⼨为固定值,布局时会尽量接近该
值。
QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整,尽可能占据更多空
间。
QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应
空间。
vData
垂直⽅向的 sizePolicy
选项同上.

使用示例:

    ui->setupUi(this);
    QHBoxLayout* layout = new QHBoxLayout();
    this->setLayout(layout);
    QPushButton* btn1 = new QPushButton("按钮1");
    QPushButton* btn2 = new QPushButton("按钮2");
    layout->addWidget(btn1);
    layout->addWidget(btn2);

在未引入spacer时,两个按钮创建是挨着的


QSpacerItem在初始化要指定宽度和高度 


    ui->setupUi(this);
    QHBoxLayout* layout = new QHBoxLayout();
    this->setLayout(layout);
    QPushButton* btn1 = new QPushButton("按钮1");
    QPushButton* btn2 = new QPushButton("按钮2");

    QSpacerItem* space = new QSpacerItem(200,20);

    layout->addWidget(btn1);
    layout->addSpacerItem(space);
    layout->addWidget(btn2);

引入spacer后 

 

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

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

相关文章

【python】python猫眼电影数据抓取分析可视化(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

安卓虚拟位置修改

随着安卓系统的不断更新&#xff0c;确保软件和应用与最新系统版本的兼容性变得日益重要。本文档旨在指导用户如何在安卓14/15系统上使用特定的功能。 2. 系统兼容性更新 2.1 支持安卓14/15&#xff1a;更新了对安卓14/15版本的支持&#xff0c;确保了软件的兼容性。 2.2 路…

Xilinx FPGA:vivado串口输入输出控制fifo中的数据

一、实验要求 实现同步FIFO回环测试&#xff0c;通过串口产生数据&#xff0c;写入到FIFO内部&#xff0c;当检测到按键信号到来&#xff0c;将FIFO里面的数据依次读出。 二、信号流向图 三、状态转换图 四、程序设计 &#xff08;1&#xff09;按键消抖模块 timescale 1ns…

批量文本编辑管理神器:一键修改多处内容,轻松转换编码,助力工作效率飞跃提升!

在信息爆炸的时代&#xff0c;文本处理已成为我们日常工作中不可或缺的一部分。无论是处理文档、整理数据还是编辑资料&#xff0c;都需要对大量的文本进行管理和修改。然而&#xff0c;传统的文本编辑方式往往效率低下&#xff0c;容易出错&#xff0c;难以满足现代工作的高效…

QListWidget 缩略图IconMode示例

1、实现的效果如下&#xff1a; 2、实现代码 &#xff08;1&#xff09;头文件 #pragma once #include <QtWidgets/QMainWindow> #include "ui_QListViewDemo.h" enum ListDataType { ldtNone -1, ldtOne 0, ldtTwo 1, }; struct ListData…

树莓派4B_OpenCv学习笔记19:OpenCV舵机云台物体追踪

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; Python 版本3.7.3&#xff1a; ​​ 今日学习&#xff1…

Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——RM & TM如何与TC建立连接 前言 看过官网 README 的第…

Python | Leetcode Python题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsDuplicate(self, nums):if len(set(nums)) ! len(nums):return Trueelse:return False

TCP一定可靠吗

背景 公司某个服务发送TCP报文后,得到的响应是非预期数据 原因竟然是:TCP包的 payload 数据某个bit位被翻转,但是 checksum 的值一样,错误的包被分发给了上层服务 Checksum介绍 IP 头有自己的 Checksum,TCP、UDP 也有自己的 Checksum,分别校验不同部分的数据 IP 头的 …

赛元单片机开发工具SOC_Programming_Tool_Enhance_V1.50 分享

下载地址&#xff1a; SOC_Programming_Tool_Enhance_V1.50(LIB0D30).rar: https://545c.com/f/45573183-1320016694-557ebd?p7526 (访问密码: 7526)

使用Spring Boot和自定义缓存注解优化应用性能

在现代应用开发中&#xff0c;缓存是提高系统性能和响应速度的关键技术之一。Spring Boot提供了强大的缓存支持&#xff0c;但有时我们需要更灵活的缓存控制。本文将介绍如何使用Spring Boot和自定义缓存注解来优化应用性能。 1. 为什么需要自定义缓存注解&#xff1f; Sprin…

干货 | 2024大模型场景下智算平台的设计与优化实践(免费下载)

诚挚邀请您微信扫描以下二维码加入方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#xff01;&#xff01;&#xff01;感谢支持&#xff01;&#xff01;&#xff01;

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

Vue3中生成本地pdf并下载

1. 前言 前端中经常会遇到在系统中根据数据导出一个pdf文件出来,一般都是后端来实现的,既然后端可以实现,前端为什么就不行呢,正好有一次也写了这个需求,就写了个小demo 示例图: 2. 实现步骤 首先下载html2pdf.js这个库yarn add html2pdf.js // 或 npm i html2pdf.js在项…

欧洲杯数据控@20240706

点击标题下「蓝色微信名」可快速关注 上半区西班牙、法国脱颖而出&#xff0c;将会争夺一个决赛的席位&#xff0c;下半区两场比赛&#xff0c;将会决出另外两支进入半决赛的球队&#xff0c; 今日射手榜&#xff0c;随着球队的淘汰&#xff0c;能争夺金靴的球员越来越少了&…

17.优化算法之解决拓扑排序4

0.基础 1.课程表1 207. 课程表 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canFinish(int n, int[][] p) {// 1. 准备⼯作int[] in new int[n]; // 统计每⼀个顶点的⼊度Map<Integer, List<Integer>> edges new HashMap<>…

整洁架构SOLID-开闭原则(OCP)

文章目录 1 定义2 最佳实践2.1 需求2.2 需求变更2.3 变更原则2.4 实现逻辑2.4.1 组件化2.4.2 组件关系 2.5 依赖方向的控制 3 本章小结 1 定义 开闭原则(OCP)是Bertrand Meyer在1988年提出的&#xff0c;该设计原则认为&#xff1a; 设计良好的计算机软件应该易于扩展&#xf…

认识并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享说前端面试的时候遇到了关于webSocket的问题&#xff0c;一看自己都没见过这个知识点&#xff0c;赶紧学习一下&#xff0c;在此记录&#xff01; WebSocket 是一种网络通信协议&#xff0c;提供了全双工通信渠道&#xff0c;即客户端和服…

Unity3D游戏 RPG

丛林探险游戏 人物进行探险游戏 拥有登录&#xff0c;首页&#xff0c;3D物体旋转浏览的功能&#xff0c;还能进行种植树等功能

GD32 MCU ADC采样率如何计算?

大家在使用ADC采样的时候是否计算过ADC的采样率&#xff0c;这个问题非常关键&#xff01; 以下为GD32F303系列MCU中有关ADC的参数&#xff0c;其中ADC时钟最大值为40MHz&#xff0c;12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话&#xff0c;可能会造成ADC采样异常&…