Question

I have a QMainWindow that starts out with nothing but a menubar with a menu that has two options. When the first is clicked the window should be populated with QLabels and various input widgets to recieve data. When the second option is clicked the window should be populated with a QTextEdit(obviously removing whatever was on the window at the time)

The following is code I have tried :

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

It's a bit messy since I've been trying various things. When I click on a menu option with this code it simply says the application has stopped working.

Any help would be appreciated.

Was it helpful?

Solution

You have at least the following options:

  • Always show the actual widget, and hide the rest. This is simple in case of two widgets like in your example. You could use this technique with the observer design pattern for any number of widgets.

  • Use the QStackedWidget class which basically behaves the way as your custom observer pattern implementation would be, although you will need to use an extra class for this.

Therefore, I would suggest to write the following code:

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

...

OTHER TIPS

you can use a QStackedWidget

start with showing an empty page and then show the correct page as needed:

there is then no need to mess with adding or removing widgets

Yes, you can use a QStakedWidget if your input options are fixed. If it's not, I suggest you to use an abstract factory pattern to create the stacked widget content. This woluld make your code more readable.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top