0

複数のフォームを持つ Qt プラグインを構築しています。フォームの左側にツリー ウィジェットが配置されたメイン フォームがあります。

このツリーに項目を追加して、これらの項目をクリックすると対応するフォームが同じフォームに読み込まれるようにします。しかし、他のフォームも選択できるように、ツリー ウィジェットをアクティブにしたいと考えています。

次のコードを使用して、メイン フォームにフォームを表示できました。

Form1 *myform;
myform=new Form1(this);
myform->show();

Form1 は、表示するフォームのクラスです。ただし、これはツリーウィジェットも覆い隠します。そして、適切なフォームを表示するためにクリックされたツリー内の項目の文字列比較を行う必要があります。

私はQtプログラミングに非常に慣れていないので、誰かがこれを手伝ってくれますか。

ありがとう

4

2 に答える 2

0

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 の使用を検討することを強くお勧めします。それは人生をとても簡単にします。詳細については、このリンクを参照してください。

于 2011-10-18T17:16:32.023 に答える