ixM には良い提案があります。最初のステップは、間違いなくメイン ウィンドウでレイアウトを使用することです。つまり、フォームを配置するウィンドウの残りの部分からツリーを分離します。ユーザーは 2 つの半分のサイズを変更できるため、スプリッターを使用することをお勧めします。メイン ウィンドウで CentralWidget のメイン ウィジェットとしてスプリッターを設定できます。
QSplitter splitter = new QSplitter(CentralWidget);
splitter->setOrientation(Qt::Horizontal);
splitter->setHandleWidth(3);
splitter->setChildrenCollapsible(false);
MyTree= new QTreeWidget(splitter);
splitter->addWidget(MyTree);
次に、左側にあるスプリッターにツリー ウィジェットを追加します。
次のステップは、スプリッターの右側にプレースホルダー ウィジェットを追加することです。また、そのウィジェット内にレイアウトを追加します。このレイアウトは非常に重要で、後で使用します。
QWidget WidgetRightSide = new QWidget(splitter);
QVBoxLayout setupLayout= new QVBoxLayout(WidgetRightSide);
setupLayout->setSpacing(0);
setupLayout->setContentsMargins(0, 0, 0, 0);
さて、この時点で、これが私の答えが前の答えと本当に違うところです。QStackedWidget を使用できます。それは確かにオプションです。その問題は、最初にすべてのフォームを作成してロードする必要があることです。これは、より多くのメモリを使用し、起動に時間がかかります。フォームが 2 ~ 5 個ある場合はそれほど悪くはありませんが、フォームが 20 個、30 個、またはそれ以上になると、非常に見苦しくなります。
代わりに、ユーザーがツリーで何かを選択すると、古いフォームを削除し、その時点で新しく選択したフォームを追加することをお勧めします。
ツリーで選択された項目が変更されたとき、これが私たちがしなければならないことです。
まず、以前の選択フォームからすべてのものを削除します。
QLayoutItem *_Item;
while ((_Item = setupLayout->takeAt(0)))
delete _Item;
次に、次に表示するフォームを見つけて作成します。
QWidget *ActiveSetupForm = NULL;
if ( I need to load form 1)
{
ActiveSetupForm = new YourNewForm( WidgetRightSide);
}
else ...
最後に、新しいフォームをレイアウトに追加します。
if(ActiveSetupForm)
{
setupLayout->addWidget(pActiveSetupForm);
}
補足として。レイアウトは手作業では難しいものです。フォームを作成するときは、QtDesigner の使用を検討することを強くお勧めします。それは人生をとても簡単にします。詳細については、このリンクを参照してください。