要的效果是以下:
QT C++ 两个QWideget A B现在有放在一个窗口QWideget Test内,初始比例要2:8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时,有条线,可以左右移动来控件 A B 窗口所占的大小widgetB (有 widgetC widgetD)又分为两个区域,可以上下拖动 初始上下比例也是1:9
要实现一个嵌套的分割窗口,其中widgetB
包含widgetC
和widgetD
,并且可以上下拖动以调整它们的大小比例,初始比例为1:9,您可以使用两个QSplitter
控件:一个用于主窗口的左右分割,另一个用于widgetB
的上下分割。
以下是实现这一功能的步骤和示例代码:
-
创建主窗口和主QSplitter: 在主窗口中创建一个
QSplitter
实例,并设置其方向为水平。 -
添加QWidget A和B到主QSplitter: 将
widgetA
和widgetB
添加到主QSplitter
中,并设置初始大小比例。 -
创建widgetB的QSplitter: 在
widgetB
内部创建另一个QSplitter
实例,并设置其方向为垂直。 -
添加widgetC和D到widgetB的QSplitter: 将
widgetC
和widgetD
添加到widgetB
的QSplitter
中,并设置初始大小比例。 -
设置初始比例: 使用
QSplitter
的setSizes
方法来设置widgetA
和widgetB
的初始大小比例,以及widgetC
和widgetD
的初始大小比例。
#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和widgetBQWidget *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和widgetDQWidget *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的布局,并添加subSplitterQVBoxLayout *layoutB = new QVBoxLayout(widgetB);layoutB->addWidget(subSplitter);// 设置主窗口的布局,并添加mainSplitterQVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);mainLayout->addWidget(mainSplitter);// 显示主窗口mainWidget->show();}w.show();return a.exec();
}
实现效果如上所示