Qt 主窗口崩溃

Qt MainWindow crashing

本文关键字:崩溃 窗口 Qt      更新时间:2023-10-16

>编辑:我从插槽中删除了析构函数。但是现在我有内存泄漏问题。我打开的每个新窗口都会占用一些内存,当我关闭它时,内存会保持占用

状态

当我执行程序并打开新窗口时,它们会正常打开。当我关闭其中任何一个时,整个应用程序崩溃(不仅是该特定窗口),并且出现崩溃错误。

我做错了什么?

mainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QHBoxLayout;
class QTextEdit;
class QWidget;
class QDialog;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void closeWindow();
    void newWindow();
private:
    Ui::MainWindow *ui;
    MainWindow *tempMainWindow;
    QHBoxLayout * mainLyt;
    QTextEdit *txtEdit;
    QWidget *mainWidget;
};
#endif // MAINWINDOW_H

主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWidget>
#include <QHBoxLayout>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mainWidget=new QWidget();
    mainLyt=new QHBoxLayout();
    txtEdit=new QTextEdit();
    mainLyt->addWidget(txtEdit);
    mainWidget->setLayout(mainLyt);
    setCentralWidget(mainWidget);
    connect(ui->actionExit,SIGNAL(triggered()),this,SLOT(closeWindow()));
    connect(ui->actionNew,SIGNAL(triggered()),this,SLOT(newWindow()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::closeWindow()
{
    this->close();
    delete txtEdit;
    delete mainLyt;
    delete mainWidget;
    this->~MainWindow();
}
void MainWindow::newWindow()
{
    tempMainWindow=new MainWindow(this);
    tempMainWindow->show();
}

如果你传递给QWidget()QHBoxLayout()QTextEdit()this(这是父级),在主窗口的选举中,Qt将为你删除UI和你在委托人中定义的所有其他小部件。通过这种方式,您可以避免调用closeWindow()方法。

delete ui也没有必要。

ui->setupUi(this);
mainWidget = new QWidget(this);
mainLyt = new QHBoxLayout(this);
txtEdit = new QTextEdit(this);

我正在尝试制作基本的文本编辑器,当触发新文本时,它应该为新文本文档打开一个新窗口。有没有更好的方法可以做到这一点?

是的。它被称为工厂,它可以是一个静态方法,因为它不对任何对象进行操作。当然,您可以从插槽中调用它。

我想您需要将文件名传递给新创建的窗口 - 这可能是工厂方法和工厂插槽的参数。如果"新"窗口为空,则这不是问题。

其他问题:

  1. 没有理由保留mainWidget成员:它始终可用 centralWidget() .

  2. 也没有理由将除ui以外的成员作为指针。这实际上是一种过早的悲观 - 它会浪费更多的堆内存。

  3. 如果中央微
  4. 件没有子微件,则不需要中央微件的布局。QTextEdit实例本身可以是中心小部件。

  5. 应使用智能指针保留ui实例。这使得析构函数完全由编译器生成(它有一个空的主体)。

  6. 您不需要closeWindow插槽中任何花哨的东西。只需删除实例!

class MainWindow : public QMainWindow
{
  Q_OBJECT
public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();
  static MainWindow * createWindow();
  void setFileName(const QString & fileName);
public slots:
  void closeWindow();
  void newWindow();
private:
  QScopedPointer<Ui::MainWindow> const ui;
  QTextEdit m_txtEdit;
};
void MainWindow::newWindow() {
   createWindow()->show();
}
void MainWindow::closeWindow() {
  deleteLater();
}
MainWindow * MainWindow::createWindow(QWidget * parent) {
  return new MainWindow(parent);
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  setCentralWidget(&m_txtEdit);
  connect(ui->actionExit, SIGNAL(triggered()), SLOT(closeWindow()));
  connect(ui->actionNew, SIGNAL(triggered()), SLOT(newWindow()));
}
MainWindow::~MainWindow()
{}

让我们看看你的代码:

this->close();
delete txtEdit;
delete mainLyt;
delete mainWidget;
this->~MainWindow();

正在尝试销毁它们,并且在下一次打开时,您几乎以相同的方式分配它们。

你在这里实现的基本上是性能损失。我建议隐藏,修改等不需要的项目。