如何动态更改QMainWindow的内容

时间:2014-04-18 12:22:45

标签: c++ qt qwidget qtgui qstackedwidget

我有一个QMainWindow,只有一个带有两个选项的菜单的菜单栏开始。单击第一个窗口时,应使用QLabel和各种输入窗口小部件填充窗口以接收数据。当单击第二个选项时,窗口应填充QTextEdit(显然删除当时窗口上的内容)

以下是我尝试过的代码:

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

因为我一直在尝试各种各样的事情,所以有点混乱。当我点击带有此代码的菜单选项时,它只是说应用程序已停止工作。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用QStackedWidget

首先显示空白页面,然后根据需要显示正确的页面:

因此无需添加或删除小部件

答案 1 :(得分:1)

您至少有以下选项:

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

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

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

orderwindow.h

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

orderwindow.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);
}

...

答案 2 :(得分:0)

是的,如果你的输入选项是固定的,你可以使用QStakedWidget。如果不是,我建议您使用抽象工厂模式来创建堆叠的窗口小部件内容。这个woluld使您的代码更具可读性。