QSplitter неправильно устанавливает размеры
У меня есть горизонтальный 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
по умолчанию. - Удаление 2-го виджета.
Это вызвано тем, что deleteLater()
удаление только по расписанию, а фактическое удаление обрабатывается после выхода swapLayout()
метод. Пытаться delete rightWidget;
вместо rightWidget->deleteLater();
если это возможно. Или обрабатывать события между удалением rightWidget
и добавление нового.