Qt QMdiArea未添加子窗口

Qt QMdiArea未添加子窗口,qt,Qt,我有一个函数,负责初始化自定义小部件并将其添加到MdiArea。当我第一次调用此函数时,它工作正常。但如果我再次调用,它将初始化自定义小部件,但不会添加到MdiArea。我在这里提到了这个功能:- void CArbWaveViewWidget::newFile() { m_ptrWavePresenter = new CArbWavePresenter; QMdiSubWindow *subWindow1 = new QMdiSubWindow; subWind

我有一个函数,负责初始化自定义小部件并将其添加到MdiArea。当我第一次调用此函数时,它工作正常。但如果我再次调用,它将初始化自定义小部件,但不会添加到MdiArea。我在这里提到了这个功能:-

void CArbWaveViewWidget::newFile()
{
     m_ptrWavePresenter = new CArbWavePresenter;

     QMdiSubWindow *subWindow1 = new QMdiSubWindow;
     subWindow1->setWidget(m_ptrWavePresenter->getTableView()); // getting customWidget
     qDebug()<<"Table View ==="<<m_ptrWavePresenter->getTableView();
     subWindow1->setAttribute(Qt::WA_DeleteOnClose);

     QMdiSubWindow *subWindow2 = new QMdiSubWindow;
     subWindow2->setWidget(m_ptrWavePresenter->getGraphView()); // getting customWidget
     qDebug()<<"Graph View ==="<<m_ptrWavePresenter->getGraphView();
     subWindow2->setAttribute(Qt::WA_DeleteOnClose);
     mdiArea->addSubWindow(subWindow1);
     mdiArea->addSubWindow(subWindow2); 
}
WaveViewWidget::newFile()
{
m_ptrWavePresenter=新的演示者;
QMdiSubWindow*子窗口1=新的QMdiSubWindow;
子窗口1->setWidget(m_ptrWavePresenter->getTableView());//获取customWidget
qDebug()getGraphView());//获取customWidget
qDebug()添加子窗口(子窗口2);
}
如何解决这个问题?

1。声明您的
qmdusibwindow
声明
QMdiSubWindow
时,将
mdiArea
作为参数

QMdiSubWindow *subWindow = new QMdiSubWindow(mdiArea);
或者您可以使用
setParent(QWidget*parent)

2.在
qmdusibwindow
3.更新
qmdusibwindow
内容 如果需要更新子窗口内容,请将
qmdusbwindow
声明为类变量,初始化
QMdiArea
qmdusbwindow
并设置
QWidget

你的班级 yourClass.cpp 您需要调用方法“show”


第一次运行正常。如果我第二次调用该函数,它不会加载子窗口。是的,因为您再次创建了所有上下文。只需更新你的小部件。为此,创建子窗口作为类变量,并调用一个只更新小部件的新函数。它将仅适用于具有一个子窗口的mdiarea。但是在我的例子中,我想要一个mdiarea,它有多个子窗口和不同的自定义小部件。如果您不知道您将拥有的qmdusbwindow的数量,请使用列表或向量。
QMdiSubWindow *subWindow = new QMdiSubWindow();
subWindow->setParent(mdiArea);
QWidget *myWidget = new QWidget();
subWindow->setWidget(myWidget);
class yourClass {

public:
    yourClass();
    void newFile();

private:
    QMdiArea *m_area;
    QMdiSubWindow *m_subWindow1, *m_subWindow2;

    void init();
};
yourClass::yourClass()
{
    init();
}

void yourClass::init()
{
    m_area = new QMdiArea();
    m_subWindow1 = new QMdiSubWindow(m_area);
    m_subWindow2 = new QMdiSubWindow(m_area);
    // continue to init your QMdiSubWindow
}

void yourClass::newFile()
{
    // Set your QWidget (yourWidget) into your QMdiSubWindow
    m_subWindow1->setWidget(yourWidget);
    m_subWindow2->setWidget(anotherWidget);
}
QMdiSubWindow *subWindow = new QMdiSubWindow();
subWindow->setParent(mdiArea);
subWindow->setWidget(yourWidget);
subWindow->show();