2

私は QMainWindow を持っていますが、それは 2 つのオプションを持つメニューを持つメニューバーだけで始まります。最初にクリックすると、データを受信するために、ウィンドウに QLabels とさまざまな入力ウィジェットが表示されます。2 番目のオプションをクリックすると、ウィンドウに QTextEdit が取り込まれます (明らかに、その時点でウィンドウにあったものはすべて削除されます)。

以下は私が試したコードです:

void OrderWindow::displayAddOrder(){
     QVBoxLayout* tlayout = new QVBoxLayout();
     QHBoxLayout* row = new QHBoxLayout();
     row->addWidget(nameLbl);
     tlayout->addLayout(row);
     qDeleteAll(children());
     delete layout();
     setLayout(tlayout);
}

いろいろ試したのでちょっと面倒です。このコードでメニュー オプションをクリックすると、単にアプリケーションが動作を停止したと表示されます。

どんな助けでも大歓迎です。

4

3 に答える 3

1

QStackedWidgetを使用できます

空のページを表示することから始めて、必要に応じて正しいページを表示します。

ウィジェットの追加や削除をいじる必要はありません

于 2014-04-18T12:42:37.020 に答える
1

少なくとも次のオプションがあります。

したがって、次のコードを書くことをお勧めします。

orderwindow.h

...
class QStackedWidget;
class OrderWindow
{
    ...
public:
    explicit OrderedWindow(QWidget *parent);
    ...
 private:
     QStackedWidget m_stackedWidget;
    ...
}
...

オーダーウィンドウ.cpp

#include "orderwindow.h"

#include <QStackedWidget>
...

OrderWindow::OrderWindow(QWidget *parent)
    : QWidget(parent)
    ,  m_stackedWidget(new QStackedWidget(this))
{
    QWidget *firstPageWidget = new QWidget;
    QWidget *secondPageWidget = new QWidget;

    m_stackedWidget->addWidget(firstPageWidget);
    m_stackedWidget->addWidget(secondPageWidget);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(stackedWidget);
    setLayout(layout);
}

...

void OrderWindow::displayAddOrder() {
    m_stackedWidget->setCurrentWidget(nameLbl);
}

...
于 2014-04-19T02:37:31.023 に答える
0

はい、入力オプションが固定されている場合は QStakedWidget を使用できます。そうでない場合は、抽象ファクトリ パターンを使用してスタック ウィジェット コンテンツを作成することをお勧めします。これにより、コードが読みやすくなります。

于 2014-04-18T17:17:21.103 に答える