QSplitter学习笔记

news2025/1/10 20:56:50

QSplitter是分割窗口控件,并且可以拖动窗口来改变窗口的大小,是主界面显示时经常用到,本篇介绍它的交互操作。

QSplitter可以容纳多个Widget,具有布局的特点,并且可以动态调整各个Widget的大小。

QSplitter布局有两种方式:垂直和水平

Qt::Orientation::Vertical

Qt::Orientation::Horizontal

下面介绍一个垂直的伸缩示例:

首先我们有3个子部件,

现在的需求是只能显示两个子部件,第一个子部件一直显示,第2个子部件显示时,第3个子部件就隐藏,

而当第3个子部件显示时第2个子部件就隐藏。

部件1代码:

#ifndef CONTENTSHOW_H
#define CONTENTSHOW_H

#include <QWidget>

namespace Ui {
class ContentShow;
}

class ContentShow : public QWidget
{
    Q_OBJECT

public:
    explicit ContentShow(QWidget *parent = nullptr);
    ~ContentShow();

private:
    Ui::ContentShow *ui;
};

#endif // CONTENTSHOW_H
#include "contentshow.h"
#include "ui_contentshow.h"

ContentShow::ContentShow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ContentShow)
{
    ui->setupUi(this);
}

ContentShow::~ContentShow()
{
    delete ui;
}

部件2输入面板

#ifndef INPUTPANEL_H
#define INPUTPANEL_H

#include <QWidget>

namespace Ui {
class InputPanel;
}

class InputPanel : public QWidget
{
    Q_OBJECT

public:
    explicit InputPanel(QWidget *parent = nullptr);
    ~InputPanel();

signals:
    void siganlToContralPanel();

public slots:
    void slotToContralPanel();

private:
    Ui::InputPanel *ui;
};

#endif // INPUTPANEL_H
#include "ui_inputpanel.h"

InputPanel::InputPanel(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::InputPanel)
{
    ui->setupUi(this);
    connect(ui->pushButton_change, SIGNAL(clicked()), this, SLOT(slotToContralPanel()));
}

InputPanel::~InputPanel()
{
    delete ui;
}

void InputPanel::slotToContralPanel()
{
    emit siganlToContralPanel();
}

部件3控制面板

#ifndef CONTRALPANEL_H
#define CONTRALPANEL_H

#include <QWidget>

namespace Ui {
class ContralPanel;
}

class ContralPanel : public QWidget
{
    Q_OBJECT

public:
    explicit ContralPanel(QWidget *parent = nullptr);
    ~ContralPanel();

signals:
    void siganlToInputPanel();

public slots:
    void slotToInputPanel();

private:
    Ui::ContralPanel *ui;
};

#endif // CONTRALPANEL_H
#include "contralpanel.h"
#include "ui_contralpanel.h"

ContralPanel::ContralPanel(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ContralPanel)
{
    ui->setupUi(this);
    connect(ui->pushButton_exit, SIGNAL(clicked()), this, SLOT(slotToInputPanel()));
}

ContralPanel::~ContralPanel()
{
    delete ui;
}

void ContralPanel::slotToInputPanel()
{
    emit siganlToInputPanel();
}

主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct MainWindowPrivate;
class ContentShow;
class InputPanel;
class ContralPanel;
class QSplitter;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initView();

public slots:
    void slotToContralPanel();
    void slotToInputPanel();
    void slotSplitterMoved(int pos, int index);


private:
    Ui::MainWindow *ui;
    QSplitter *m_splitter;
    ContentShow *m_contentShow;
    InputPanel *m_inputPanel;
    ContralPanel *m_contralPanel;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "inputpanel.h"
#include "contentshow.h"
#include "contralpanel.h"
#include <QSplitter>
#include <QVBoxLayout>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initView();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initView()
{
    m_splitter = new QSplitter(Qt::Vertical, ui->widget);
    m_contentShow = new ContentShow(ui->widget);
    m_inputPanel = new InputPanel(ui->widget);
    m_contralPanel = new ContralPanel(ui->widget);

    connect(m_inputPanel, SIGNAL(siganlToContralPanel()), this, SLOT(slotToContralPanel()));
    connect(m_contralPanel, SIGNAL(siganlToInputPanel()), this, SLOT(slotToInputPanel()));

    m_contentShow->setMinimumHeight(260);
    m_inputPanel->setMinimumHeight(190);
    m_contralPanel->setMinimumHeight(190);
    m_splitter->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);

    m_splitter->addWidget(m_contentShow);
    m_splitter->addWidget(m_inputPanel);
    m_splitter->addWidget(m_contralPanel);
    m_splitter->setHandleWidth(1);
    QList<int> heightList;
    heightList.append(360);
    heightList.append(200);
    heightList.append(200);
    m_splitter->setSizes(heightList);
    //不允许折叠
    m_splitter->setChildrenCollapsible(false);
    m_splitter->setStyleSheet("");
    m_contralPanel->hide();

    QVBoxLayout *layout = new QVBoxLayout(ui->widget);
    layout->setMargin(0);
    layout->addWidget(m_splitter);
    layout->setStretchFactor(m_splitter, 1);
    ui->widget->setLayout(layout);
}

void MainWindow::slotToContralPanel()
{
    m_inputPanel->hide();
    m_contralPanel->show();
}

void MainWindow::slotToInputPanel()
{
    m_inputPanel->show();
    m_contralPanel->hide();
}



主函数文件:

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

运行效果:

从上面可以看出当托动第2个部件时再点转换按钮,第3个部件的在大没没有随2个部件的大小而改变,显示的是原来的初始化大小,有点不协调。

那么如果让第3个部件显示时大小为第2个部件的大小呢。

思路1:当拖动时更新第3个部件的大小,拖动第3个部件时更新第2个部件的大小,例如

connect(m_splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(slotSplitterMoved(int, int)));

void MainWindow::slotSplitterMoved(int pos, int index)
{
    if(1 == index) {
        QSize size = m_inputPanel->size();
        m_contralPanel->resize(size);
    }
    else if(2 == index) {
        QSize size = m_contralPanel->size();
        m_inputPanel->resize(size);
    }
}

但是上面这段代码没有作用,拖动第2个部件修复第3个部件大小,这时再显示第3个部件时还没原来的大小。

思路2:每次设置qsplitter的Sizes,通过setSizes函数设置

 

void MainWindow::slotToContralPanel()
{
    QList<int> splitter = m_splitter->sizes();
    qDebug() << "MainWindow::slotToContralPanel===splitter=" << splitter
             << " line= " << __LINE__;
    splitter.swap(1,2);
    m_splitter->setSizes(splitter);
    m_inputPanel->hide();
    m_contralPanel->show();
}

void MainWindow::slotToInputPanel()
{
    QList<int> splitter = m_splitter->sizes();
    qDebug() << "MainWindow::slotToInputPanel===splitter=" << splitter
             << " line= " << __LINE__;
    splitter.swap(1,2);
    m_splitter->setSizes(splitter);
    m_inputPanel->show();
    m_contralPanel->hide();
}

这样每次都更新了分隔块的大小。

以上看出转换部件时,就显示流畅很多了,与上一个部件大小一样。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端学习第五站——CSS学习进阶篇

目录 一、选择器进阶 1. 后代选择器&#xff08;空格&#xff09; 2. 子代选择器 > 3. 并集选择器&#xff1a;&#xff0c; 4. 交集选择器&#xff1a;紧挨着 5. hover伪类选择器 6. emmet语法 7. 选择器总结 二、背景相关属性 1. 背景颜色 2. 背景图片 3. 背景…

若依框架对接LDAP

这里直接使用spring ldap实现认证。 背景在若依框架上对接LDAP 代码 引入依赖 <!-- 对接ldap --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-ldap</artifactId></dependency>…

React-Native 开发实用指南|环信学院

本文主要介绍 React-Native 的实际使用经验&#xff0c;对于想要快速入门的同学是有帮助的。 作者 | 佐玉 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 1、整体介绍 首先说&#xff0c; React-Native 用来做什么&#xff1f;传统的开发中&#xff0c;按照平…

编译原理学习笔记16——语义分析和中间代码生成1

编译原理学习笔记16——语义分析和中间代码生成116.1 中间语言16.2 常用的中间语言形式16.1 中间语言 中间语言的特点和作用 特点 独立于机器复杂性界于源语言和目标语言之间 引入中间语言的优点 使编译程序的结构在逻辑上更为简单明确便于进行与机器无关的代码优化工作易于移…

力扣刷题|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

LeetCode 110.平衡二叉树 题目链接&#x1f517; LeetCode 110.平衡二叉树 思路 递归三部曲分析&#xff1a; 明确函数的形参和返回值 参数&#xff1a;当前传入结点 返回值&#xff1a;以当前传入结点为根节点的树的高度 那么如何标记左右子树是否差值大于1呢&#xff…

3、SpringJdbcTemplate声明式事务

JdbcTemplate基本使用 01-JdbcTemplate基本使用-概述(了解) JdbcTemplate是spring框架中提供的一个对象&#xff0c;是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如&#xff1a;操作关系型数据的JdbcTemplate和HibernateTemplate&…

在Anaconda中安装pytorch的详细步骤+PyCharm环境配置

前言 深度学习小白一枚&#xff0c;自己的笔记本配置如下&#xff1a; 显卡&#xff1a;NVIDIA GeForce MX150&#xff08;非常垃圾的笔记本显卡&#xff09;固态硬盘 256GCPU&#xff1a;lntel Core™i7-8550UWindows&#xff1a;Windows 11家庭中文版 其他配置&#xff1a;…

代驾app开发开发搭建,代驾系统软件源码

在当下移动互联网发展的今天&#xff0c;大家对于生活的追求更加的趋向于其便捷性&#xff0c;这使得各种各样app被开发出来&#xff0c;出现在我们的生活之中。现在就把近期比较火的代驾app开发开发搭建的一些方案介绍一下。 代驾app产生的原因 代驾行业的快速发展&#xf…

<Java EE 进阶> Spring 创建和使用

目录 1.创建Spring项目 &#xff08;1&#xff09;创建一个Maven项目 &#xff08;2&#xff09;添加 Spring 框架支持&#xff08;spring-context、spring-beans&#xff09; &#xff08;3&#xff09;添加启动类 2.存储 Bean 对象 &#xff08;1&#xff09;创建 Bean …

计算几何知识(其一)

前提 最近闲着没事就看了计算几何的一些知识 构建凸包 Incremental Construction 复杂度为O(n2)原理就是不停蚕食下一个合适的点。判断原理是&#xff0c;第X个极点和前n个极点构成的多边形会有切点S&#xff0c;T。 和这两个点的连线&#xff0c;把原先多边形分成两个区域…

【软件测试】翻了下招聘APP只会点点点,很慌......测试业务?技术?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 我猜想大伙的职业生…

从0到0.1学习 maven(二:坐标、依赖和仓库)

该文章为maven系列学习的第二篇 第一篇快速入口&#xff1a;从0到0.1学习 maven(一&#xff1a;概述及简单入门) 第二节&#xff1a;坐标、依赖与仓库坐标依赖依赖范围传递性依赖依赖调解可选依赖依赖排除归类依赖优化依赖仓库路径生成仓库分类本地仓库远程仓库快照部署至远程仓…

Day 16 Enable注解

Springboot中提供了很多Enable开头的注解&#xff0c;这些注解是冬天开启某些功能的&#xff0c;而其底层使用Import注解导入一些配置类&#xff0c;实现Bean的动态加载1 EnableAutoConfigurationTarget(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inhe…

京东十年T8架构师手撕MySQL:手写666页核心知识,超85%问题全解

MySQL是开放源码的关系数据库管理系统&#xff0c;由于 性能高、成本低、可靠性好&#xff0c;成为现在最流行的开源数据库。 MySQL学习指南 笔记包含了3个大章节&#xff0c;13个小章节&#xff1a; 基础篇 MySQL数据类型MySQL运算符MySQL函数MySQL数据库查询语句 核心篇 …

​力扣解法汇总2319. 判断矩阵是否是一个 X 矩阵

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#…

自动化设备ERP系统对企业管理有什么好处?

随着自动化设备制造企业的快速发展&#xff0c;规模和产能的不断扩大&#xff1b;设备也不断增加、品种越来越多&#xff1b;企业信息化建设也不断发展和完善, 自动化设备ERP系统已经成为企业信息化建设的一个有机组成部分。自动化设备管理已进入信息化、数字化时代。自动化设备…

机器学习之求解无约束最优化问题方法(手推公式版)

文章目录前言1. 基础知识1.1 方向导数1.2 梯度1.3 方向导数与梯度的关系1.4 泰勒展开公式1.5 Jacobian矩阵与Hessian矩阵1.6 正定矩阵2. 梯度下降法3. 牛顿法4. 拟牛顿法5. 代码实现结束语前言 本篇博文主要介绍了机器学习里面的常见的求解无约束最优化问题的方法&#xff0c;包…

LeetCode——1664. 生成平衡数组的方案数

一、题目 给你一个整数数组 nums。你需要选择恰好一个下标&#xff08;下标从0开始&#xff09;并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。 比方说&#xff0c;如果 nums [6,1,7,4,1] &#xff0c;那么&#xff1a; 选择删除下标 1 &#xff0…

在CentOS-6.9部署apache服务

文章目录一 系统环境二 部署服务2.1 yum安装软件2.2 修改主配置文件2.3 修改防火墙规则2.4 访问测试三 主配置文件参数3.1 主配置文件常规语句3.2 主配置文件日志控制语句3.3 主配置文件的性能控制语句一 系统环境 参数值主机IP10.0.0.100主机名test操作系统版本CentOS releas…

css 过渡动画

目录过渡动画1 css 属性1.1 transform 变换&#xff08;平移旋转缩放&#xff09;1.2 animation 动画1.2.1 keyframes1.3 transition 过渡1.4 比较2 方式2.1 css 伪类2.2 vue <Transition> 组件2.2.1 默认名称2.2.2 自定义名称2.2.3 自定义 class2.2.4 配合 animation2.2…