2

我有一个 QMainWindow,它开始时只有一个带有两个选项的菜单的菜单栏。单击第一个时,窗口应填充 QLabels 和各种输入小部件以接收数据。单击第二个选项时,应使用 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

您至少有以下选择:

  • 始终显示实际的小部件,并隐藏其余部分。如果您的示例中有两个小部件,这很简单。您可以将此技术与观察者设计模式一起用于任意数量的小部件。

  • 使用QStackedWidget 类,它的行为基本上与您的自定义观察者模式实现的方式相同,尽管您需要为此使用额外的类。

因此,我建议编写以下代码:

订单窗口.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 回答