QSplitter 未正确设置大小

Posted

技术标签:

【中文标题】QSplitter 未正确设置大小【英文标题】:QSplitter does not correctly set sizes 【发布时间】:2011-12-12 15:53:20 【问题描述】:

我有一个带有两个小部件的水平 QSplitter。我想以保持用户设置的比例的方式用新的小部件替换右手小部件。以下是我目前拥有的代码的简化版本:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    splitter = new QSplitter(this);
    splitter->setOrientation(Qt::Horizontal);

    leftWidget = new QPushButton("left", splitter);
    rightWidget = new QPushButton("right", splitter);

    splitter->addWidget(leftWidget);
    splitter->addWidget(rightWidget);

    setCentralWidget(splitter);


void MainWindow::swapLayout()

    QList<int> sizes = splitter->sizes();

    rightWidget->deleteLater();
    splitter->update();

    rightWidget = new QPushButton("new right", splitter);

    splitter->addWidget(rightWidget);
    splitter->setSizes(sizes);

swapLayout() 保存尺寸,移除右侧小部件,添加新的右侧小部件并尝试重置尺寸。然而,左侧小部件占据了 100% 的空间。在不尝试恢复大小的情况下,小部件都占用了 50% 的空间。

【问题讨论】:

【参考方案1】:

我认为实际的操作顺序是:

    保存 2 个小部件的大小; 添加第三个小部件。 设置3个小部件的大小(sizes.at(2)默认为0。 正在删除第二个小部件。

这是因为deleteLater()只是调度删除,实际删除是在退出swapLayout()方法后处理的。如果可能,请尝试使用 delete rightWidget; 而不是 rightWidget-&gt;deleteLater();。或者在删除rightWidget 和添加新事件之间处理事件。

【讨论】:

谢谢你,问题是 deleteLater() 没有在那里删除小部件。最后,我使用了您按 1、2、4、3 顺序列出的步骤,并且在删除之前还调用了小部件上的隐藏以确保确定。再次感谢!

以上是关于QSplitter 未正确设置大小的主要内容,如果未能解决你的问题,请参考以下文章

在 QSplitter PyQt 应用程序中设置 QTabWidget 的初始大小

分割窗口QSplitter类

如何设置qsplitter中widget的默认宽度

在 UWP 中使用模糊效果绘制图像未正确设置图像大小

QT QSplitter设置初始比例setStretchFactor失效解决

QGraphicsView 滚动条策略未按预期工作