如何从我的 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()
中添加一些调试打印)。
我正在使用 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()
中添加一些调试打印)。