【问题标题】:QMdiArea not adding subwindowQMdiArea 不添加子窗口
【发布时间】:2014-11-20 05:16:07
【问题描述】:

我有一个函数负责初始化自定义小部件并将其添加到 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); 
}

我该如何解决这个问题?

【问题讨论】:

    标签: qt


    【解决方案1】:

    1。声明您的QMdiSubWindow

    当您声明 QMdiSubWindow 时,将 mdiArea 作为参数提供

    QMdiSubWindow *subWindow = new QMdiSubWindow(mdiArea);
    

    或者你可以使用setParent ( QWidget * parent )

    QMdiSubWindow *subWindow = new QMdiSubWindow();
    subWindow->setParent(mdiArea);
    

    2。在您的QMdiSubWindow 中创建并添加您的QWidget

    QWidget *myWidget = new QWidget();
    subWindow->setWidget(myWidget);
    

    3。更新QMdiSubWindow内容

    如果您需要更新子窗口内容,请将您的QMdiSubWindow 声明为类变量,初始化您的QMdiAreaQMdiSubWindow 并设置QWidget

    yourClass.h

    class yourClass {
    
    public:
        yourClass();
        void newFile();
    
    private:
        QMdiArea *m_area;
        QMdiSubWindow *m_subWindow1, *m_subWindow2;
    
        void init();
    };
    

    yourClass.cpp

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

    【讨论】:

    • 第一次工作正常。如果我第二次调用该函数,它不会加载子窗口。
    • 是的,因为您再次创建了所有上下文。只需更新您的小部件。为此,将您的子窗口创建为类变量,并调用一个仅更新您的小部件的新函数。
    • 它只适用于具有一个子窗口的 mdiarea。但在我的情况下,我想要一个带有多个子窗口和不同自定义小部件的 mdiarea。
    • 你可以在你的类中添加另一个 QMdiSubWindow:m_subWindow2。如果您不知道您将拥有的 QMdiSubWindow 的数量,请使用列表或向量。
    【解决方案2】:

    你需要调用方法“show”

    QMdiSubWindow *subWindow = new QMdiSubWindow();
    subWindow->setParent(mdiArea);
    subWindow->setWidget(yourWidget);
    subWindow->show();
    

    【讨论】:

    • 奇怪,但确实是我的错。我创建了一个小部件,然后调用 addSubWindow 什么都没有...感谢您的评论,我认识到我的窗口根本不可见。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2023-03-21
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多