【问题标题】:How to change contents of QMainWindow dynamically如何动态更改 QMainWindow 的内容
【发布时间】:2014-06-02 23:01:33
【问题描述】:

我有一个 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);
}

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

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ qt qwidget qtgui qstackedwidget


    【解决方案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);
    }
    
    ...
    

    【讨论】:

    • 太棒了,这很有帮助,在我之前尝试使用 QStackedWidget 时发现我初始化它不正确,即 new QStackedWidget() 没有这个参数。
    【解决方案2】:

    您可以使用QStackedWidget

    从显示一个空白页面开始,然后根据需要显示正确的页面:

    这样就不需要添加或删除小部件了

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        • 1970-01-01
        相关资源
        最近更新 更多