0

2つのウィジェットを備えた水平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%を占めます。

4

1 に答える 1

2

実際の操作の順序は次のとおりです。

  1. 2つのウィジェットのサイズを節約します。
  2. 3番目のウィジェットを追加します。
  3. 3つのウィジェットのサイズを設定します(デフォルトでsizes.at(2)0です。
  4. 2番目のウィジェットを削除しています。

これは、deleteLater()削除をスケジュールするだけで、実際の削除はswapLayout()メソッドを終了した後に処理されるためです。可能であれば、delete rightWidget;代わりに試してください。rightWidget->deleteLater();または、新しいイベントを削除rightWidgetしてから追加するまでの間にイベントを処理します。

于 2011-12-12T19:03:26.430 に答える