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);
}
</int>

swapLayout() сохраняет размеры, удаляет правый виджет, добавляет новый виджет правой руки и пытается сбросить размеры. Однако виджет левой руки занимает 100% пространства. Не пытаясь восстановить размеры, виджеты занимают 50% пространства.

1 ответ

Я думаю, что фактический порядок операций:

  1. сохранение размеров 2 виджетов;
  2. добавление третьего виджета.
  3. размер установки для 3 виджетов (и sizes.at(2) равен 0 по умолчанию.
  4. Удаление второго виджета.

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

licensed under cc by-sa 3.0 with attribution.