我有一个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);
}
因为我一直在尝试各种各样的事情,所以有点混乱。当我点击带有此代码的菜单选项时,它只是说应用程序已停止工作。
任何帮助都将不胜感激。
答案 0 :(得分:1)
答案 1 :(得分:1)
您至少有以下选项:
始终显示实际的小部件,并隐藏其余小部件。如果你的例子中有两个小部件,这很简单。您可以将此技术与观察者设计模式一起用于任意数量的小部件。
使用基本上与自定义观察者模式实现方式相同的QStackedWidget class,尽管您需要为此使用额外的类。
因此,我建议编写以下代码:
...
class QStackedWidget;
class OrderWindow
{
...
public:
explicit OrderedWindow(QWidget *parent);
...
private:
QStackedWidget m_stackedWidget;
...
}
...
#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使您的代码更具可读性。