如何从我的 first/original MainWindow 打开第二个 QMainWindow?

How to open a second QMainWindow from my first/original MainWindow?

我正在使用 Qt6 和 C++ 创建一个桌面应用程序,并且我有我原来的 MainWindow class。使用 Qt Creator,我为新的 SummaryClass (QMainWindow) 生成了 ui,h,cpp。 我希望能够单击位于 MainWindow 中的按钮,以便打开 SummaryWindow。

  void MainWindow::openSummary()
    {
    SummaryWindow window;
    window.show();
    }

我知道在函数结束时 window 实例超出范围并被销毁。 (由 Qt Creator 生成的析构函数被自动调用)因为 window 出现然后消失 quickly。 如果我只是简单地执行

SummaryWindow window = new SummaryWindow();
window.show();

window 会成功显示,但随后会造成内存泄漏。

有没有workarounds/solutions我想要达到的目标?

明确地说,我想打开 window 并保持 windows 可见。

一种替代方法是定义一个指向 summaryClass 的指针列表,然后在主窗口中的按钮插槽中创建和显示尽可能多的摘要实例

你的mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QList<SummaryClass*> l;
};

和按钮的插槽

void MainWindow::on_pushButton_clicked()
{
    SummaryClass* sm = new SummaryClass(this);
    l.push_back(sm);
    sm->show();
}

一旦你这样做:

new SummaryClass(this);

每个摘要class将在mainWin被销毁时被销毁....


SummaryWindow的构造函数中写:

SummaryWindow::SummaryWindow() {
   this->setAttribute(::Qt::WA_DeleteOnClose);
   ...
}

这就是诀窍。现在

auto window = new SummaryWindow();
window->show();

不会导致内存泄漏。 (为了确保,您可以在 ~SummaryWindows() 中添加一些调试打印)。