Как динамически изменять содержимое QMainWindow

У меня есть 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);
}

Это немного грязно, так как я пробовал разные вещи. Когда я нажимаю на пункт меню с этим кодом, он просто говорит, что приложение перестало работать.

Любая помощь будет оценена по достоинству.


person Vinc    schedule 18.04.2014    source источник


Ответы (3)


У вас есть как минимум следующие варианты:

  • Всегда показывайте сам виджет и скрывайте остальные. Это просто в случае двух виджетов, как в вашем примере. Вы можете использовать эту технику с шаблоном проектирования наблюдателя для любого количества виджетов.

  • Используйте класс 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);
}

...
person lpapp    schedule 19.04.2014
comment
Удивительно, это очень помогло, оказывается, в моей предыдущей попытке с QStackedWidget я неправильно инициализировал его, то есть новый QStackedWidget() без аргумента this. - person Vinc; 19.04.2014

вы можете использовать QStackedWidget

начните с отображения пустой страницы, а затем покажите правильную страницу по мере необходимости:

тогда не нужно возиться с добавлением или удалением виджетов

person ratchet freak    schedule 18.04.2014

Да, вы можете использовать QStakedWidget, если ваши параметры ввода фиксированы. Если это не так, я предлагаю вам использовать абстрактный фабричный шаблон для создания сложенного содержимого виджета. Это сделает ваш код более читабельным.

person Alberto Jovem Jovem    schedule 18.04.2014