QSplitter неправильно устанавливает размеры - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть горизонтальный 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 голосов
/ 12 декабря 2011

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

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

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

...