Qt布局之QSplitter

news/2025/2/22 10:54:01/文章来源:https://www.cnblogs.com/rainbow70626/p/18730669

简述
QSplitter拆分器是一个布局控件。用户通过拖动它们之间的边界来控制子部件的大小。 在不确定子部件UI大小时,可以用此控件布局,让用户自行调整控件尺寸。

属性
名称 类型 描述
childrenCollapsible bool 用户是否可以将子部件的大小调整为0。默认情况下,子控件是可折叠的。
handleWidth int
拆分器操作区域的宽度。默认值取决于用户使用的平台以及样式偏好设置。

opaqueResize bool
如果在交互移动拆分器时动态(不透明)调整部件的大小,则返回true,否则返回false。

orientation Qt::Orientation 拆分器的方向,默认情况下,方向是水平的。可设置属性为: Qt::Horizontal 和 Qt::Vertical。
如何使用此控件
在Qt Designer中,拖入QListWidget 和 QTabWidget控件之后,选中它们点击右键,选择使用拆分器水平布局。

接着就是给主界面布局,在空白区域点击右键,选择水平布局 和 垂直布局均可,因为此时,QListWidget 和 QTabWidget控件已经处于拆分布局中,对于主界面而言,它们是一个整体,没有其它子控件了。 将上述例子运行起来,效果如下:

在代码中使用QSplitter

        接下来介绍如何在代码中使用QSplitter。以下是示例:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QListWidget>
#include <QTabWidget>
#include <QSplitter>
#include <QVBoxLayout>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//拆分器布局,默认是水平布局QSplitter *splitter = new QSplitter;QListWidget *listWidget = new QListWidget(this);QTabWidget *tabWidget = new QTabWidget(this);tabWidget->insertTab(0, new QWidget(this), "tab 1");tabWidget->insertTab(1, new QWidget(this), "tab 2");//加入子部件splitter->addWidget(listWidget);splitter->addWidget(tabWidget);//主界面布局,水平或者垂直均可QVBoxLayout* vlay = new QVBoxLayout;vlay->addWidget(splitter);ui->centralwidget->setLayout(vlay);}MainWindow::~MainWindow()
{delete ui;
}

  编译运行后是如下模样:

问题来了
在实际的项目开发过程中,左侧的QListWidget控件是用来做内容导航的,默认的布局大小肯定不符合你的需求,而且同时要求在界面拉伸的时候,保持一定的比例,接下来开始解决这个问题。

方法1:设置拉伸比例
在布局设置完毕后,加入如下代码,作用是设置子控件的拉伸比例。setStretchFactor方法的参数分别是子控件索引、拉伸参数。

    //设置拉伸比例splitter->setStretchFactor(0, 1);splitter->setStretchFactor(1, 9);

运行之后,看上去布局比列好很多了: 

方法2:设置尺寸列表

        加入resizeEvent事件,在其中使用 QSplitter::setSizes(const QList<int> &list) 方法,也可以达到同样的目的。 改造例子后,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QListWidget>
#include <QTabWidget>
#include <QSplitter>
#include <QVBoxLayout>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//拆分器布局,默认是水平布局QSplitter *splitter = new QSplitter;QListWidget *listWidget = new QListWidget(this);QTabWidget *tabWidget = new QTabWidget(this);tabWidget->insertTab(0, new QWidget(this), "tab 1");tabWidget->insertTab(1, new QWidget(this), "tab 2");//加入子部件splitter->addWidget(listWidget);splitter->addWidget(tabWidget);//主界面布局,水平或者垂直均可QVBoxLayout* vlay = new QVBoxLayout;vlay->addWidget(splitter);ui->centralwidget->setLayout(vlay);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::resizeEvent(QResizeEvent*)
{//找到拆分器QSplitter *splitter = this->findChild<QSplitter*>();if (splitter) {//水平拆分布局,使用控件宽度。 垂直拆分布局,使用控件高度。int left_w = 180;int right_w = splitter->size().width() - left_w;splitter->setSizes( { left_w,  right_w } );}
}

原文链接:Qt布局之QSplitter

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习理论:预测器-拒绝器多分类弃权学习

弃权学习(learning with abstention)主要是为了使分类器在学习过程中可能出现的误导性或者不正确的信息时(这常被称为“幻觉”),能够对做出预测进行弃权。目前,弃权学习的方法主要可以分为以下几种:基于置信度的方法(confidence-based methods)。这种方法在预训练模型…

Cypher Chapter 6:DIGITAL CRYPTOGRAPHY

PUZZLE1 0110 0100 0110 0001 0111 0100 0110 0001SOLVE1 通过 ASCII 码表可知,明文为 data。 PUZZLE2 HELLO 0011 1111 0010 1010 0011 1110 0010 0000 0010 1011SOLVE2 容易猜出答案是 world,不过如何得到的呢? 考虑将 HELLO 换为 ASCII 码形式,即 0100 1000 0100 0101 0…

2246. 相邻字符不同的最长路径(难)

目录题目题解:dfs 题目给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父 节点,由于节点 0 是根节点,所以 parent[0] == -1 。…

普通人如何靠 AI 副业,1 个月实现月薪 3 万 +

在物价飞涨、经济低迷的今天,仅靠死工资,却有着不固定的开销?房贷、车贷、孩子的教育费用…… 望着日益增长的开销,你是否也在夜深人静时,为钱包的羞涩而发愁?无数次幻想过拥有一份高收入的副业,却始终在迷茫中徘徊,不知从何下手。 如今,AI 时代的浪潮汹涌而来,为我们…

C内存模型

分区 在C语言中,内存被分为以下几个部分 .text 代码段,存放程序的可执行代码,不可修改 .rodata(Read Only Data) 常量区,存放全局常量 .data 数据段,存放已初始化的全局变量和静态变量 .bss(Block Started By Symbol) 未初始化数据段,存放未初始化的全局变量或者初始化为…

探秘Transformer系列之(5)--- 训练推理

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(5)--- 训练&推理 0x00 概述 Transformer训练的目的是通过对输入…

124. 二叉树中的最大路径和(困难)

目录题目题解:后序遍历 题目二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回…

Windsurf AI编程工具

Windsurf AI编程工具实操指南目录一、环境搭建与核心功能安装与登录模型选择与配置中文环境配置二、开发全流程实操创建项目将api目录下的模型调用抽象为服务层三、避坑指南四、与Cursor对比结语安装包 一、环境搭建与核心功能 安装与登录 访问Windsurf官网下载适配版本,支持W…

让你搜索效率翻倍的技巧

本文是《最全面的浏览器教程》第五篇,介绍一些好用的搜索引擎技巧。​ 本文是《最全面的浏览器教程》第五篇,介绍一些好用的搜索引擎技巧。 上一篇文章推荐了很多好用的搜索引擎,但要用好它们,还得加上很多技巧:例如指定文件类型,排除某些内容,在指定域名内搜索等。 本文…

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 @目录4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层:连接层1.4 第2层:服务层1.5 第3层:引擎层1.6 存储层2. SQL执行流程2.1 MySQL 中的 SQL 执行流程2.2 MySQL8中SQL执行原理最后:1. 逻辑架构剖析…

无线充电

https://baijiahao.baidu.com/s?id=1809048563048631142&wfr=spider&for=pc 工信部放宽无线充电设备频率和功率限制,安卓厂商或加大无线充电功率,苹果则因Qi2.0标准频率与航空无线电导航业务冲突而调整。无线充电技术发展迅速,但仍需解决充电发热等问题。咱也就是说…

陪玩平台搭建,利用Redis实现多级缓存

陪玩平台搭建,利用Redis实现多级缓存如何使用redis6客户端缓存前置条件: redis服务端版本必须是>=6。lettuce版本>=6 目前java的redis客户端找了一圈,貌似只有lettuce 6支持,其他客户端估计后期会支持1、项目中pom引入lettuce GAV<dependency><groupId>i…