2011-10-18 4 views
0

私は複数のフォームでQtプラグインを構築しています。私はフォームの左側にツリーウィジェットを配置したメインフォームを持っています。Qtでツリーを使ってフォームを表示

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

私は、次のコードを使用して、メインフォーム上のフォームを表示することができた:Form1が私が表示しようとするフォームのクラスである

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

。しかし、これは、ツリーウィジェットもカバーしています。そして、適切なフォームを表示するためにクリックされたツリー内のアイテムの文字列比較を行う必要があります。

誰かがQtプログラミングの新機能として私にこれを手伝ってもらえますか?

おかげ

答えて

0

は、私は正確にあなたが達成しようとしているものを理解していないが、あなたが表示されているコードのビットは、あなたがQtのが提供するレイアウトを使用していないことを示唆しています。

ツリー内でクリックされたアイテムに応じてフォームを動的にロードできるようにするには、ツリーを挿入するレイアウト(QHBoxLayoutとします)とQStackedWidgetそれぞれのフォームを(addWidget()を使用して)「保存」し、setCurrentIndex()を呼び出して表示するフォームを選択することができます。

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を使用することを強くお勧めします。それは人生をはるかに容易にする。詳細について知りたい場合は、linkをご覧ください。

関連する問題