QT 左右 上下,拉伸 分配窗口大小

要的效果是以下:

QT C++ 两个QWideget A B现在有放在一个窗口QWideget Test内,初始比例要2:8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时,有条线,可以左右移动来控件 A B 窗口所占的大小widgetB (有 widgetC widgetD)又分为两个区域,可以上下拖动 初始上下比例也是1:9

要实现一个嵌套的分割窗口,其中widgetB包含widgetCwidgetD,并且可以上下拖动以调整它们的大小比例,初始比例为1:9,您可以使用两个QSplitter控件:一个用于主窗口的左右分割,另一个用于widgetB的上下分割。

以下是实现这一功能的步骤和示例代码:

  1. 创建主窗口和主QSplitter : 在主窗口中创建一个QSplitter实例,并设置其方向为水平。

  2. 添加QWidget A和B到主QSplitter : 将widgetAwidgetB添加到主QSplitter中,并设置初始大小比例。

  3. 创建widgetB的QSplitter : 在widgetB内部创建另一个QSplitter实例,并设置其方向为垂直。

  4. 添加widgetC和D到widgetB的QSplitter : 将widgetCwidgetD添加到widgetBQSplitter中,并设置初始大小比例。

  5. 设置初始比例 : 使用QSplittersetSizes方法来设置widgetAwidgetB的初始大小比例,以及widgetCwidgetD的初始大小比例。

    #include "mainwindow.h"

    #include <QApplication>
    #include "LayersFrameList.h"

    #include <qDebug>
    #include <QSplitter>

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    MainWindow w;

    {
    // 创建主窗口
    QWidget *mainWidget = new QWidget;
    mainWidget->resize(800, 600);

    复制代码
             // 创建主QSplitter,水平方向
             QSplitter *mainSplitter = new QSplitter(Qt::Horizontal, mainWidget);
    
             // 创建widgetA和widgetB
             QWidget *widgetA = new QWidget;
             widgetA->setStyleSheet("background-color: lightblue;");
             QWidget *widgetB = new QWidget;
             widgetB->setStyleSheet("background-color: lightgrey;");
    
             // 将widgetA和widgetB添加到主QSplitter中
             mainSplitter->addWidget(widgetA);
             mainSplitter->addWidget(widgetB);
    
             // 设置widgetA和widgetB的初始大小比例
             QList<int> mainSizes;
             mainSizes << mainWidget->width() * 0.2 << mainWidget->width() * 0.8;
             mainSplitter->setSizes(mainSizes);
    
             // 创建widgetB的QSplitter,垂直方向
             QSplitter *subSplitter = new QSplitter(Qt::Vertical, widgetB);
    
             // 创建widgetC和widgetD
             QWidget *widgetC = new QWidget;
             widgetC->setStyleSheet("background-color: lightgreen;");
             QWidget *widgetD = new QWidget;
             widgetD->setStyleSheet("background-color: pink;");
    
             // 将widgetC和widgetD添加到widgetB的QSplitter中
             subSplitter->addWidget(widgetC);
             subSplitter->addWidget(widgetD);
    
             // 设置widgetC和widgetD的初始大小比例
             QList<int> subSizes;
             subSizes << widgetB->height() * 0.1 << widgetB->height() * 0.9;
             subSplitter->setSizes(subSizes);
    
             // 设置widgetB的布局,并添加subSplitter
             QVBoxLayout *layoutB = new QVBoxLayout(widgetB);
             layoutB->addWidget(subSplitter);
    
             // 设置主窗口的布局,并添加mainSplitter
             QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
             mainLayout->addWidget(mainSplitter);
    
             // 显示主窗口
             mainWidget->show();
     }
    
     w.show();
     return a.exec();

    }

实现效果如上所示

相关推荐
牛奔9 小时前
macOS 使用 conda,同时本地安装了python,遇到 ModuleNotFoundError: No module named ‘xxx‘` 解决
开发语言·python·macos·conda
superman超哥9 小时前
仓颉跨语言编程:FFI外部函数接口的原理与深度实践
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉跨语言编程·ffi外部函数接口
玄同76510 小时前
Python 项目实战中“高内聚低耦合”的设计方法 —— 基于七大设计原则与拓展技巧
开发语言·人工智能·python·语言模型·pycharm·设计原则·项目实战
摇滚侠10 小时前
Java 零基础全套视频教程,日期时间 API,笔记147-148
java·开发语言·笔记
不惑_10 小时前
Windows安装Java
java·开发语言·windows
毕设源码-赖学姐10 小时前
【开题答辩全过程】以 基于Java的化学实验室信息管理系统为例,包含答辩的问题和答案
java·开发语言
咕噜咕噜啦啦10 小时前
Java速通(应用程序)
java·开发语言
我是人机不吃鸭梨10 小时前
Flutter AI 集成革命(2025版):从 Gemini 模型到智能表单验证器的终极方案
开发语言·javascript·人工智能·flutter·microsoft·架构
沐知全栈开发10 小时前
服务定位器模式
开发语言
期待のcode10 小时前
Java Object 类
java·开发语言