簡體   English   中英

Qt MainWindow崩潰

[英]Qt MainWindow crashing

編輯:我從插槽中刪除了析構函數。 但是現在我有內存泄漏問題。 我打開的每個新窗口都占用一些內存,當我關閉它時,內存仍然占用

當我執行程序並打開新窗口時,它們會正常打開。 當我關閉其中的任何一個時,整個應用程序都崩潰(不僅是特定的窗口),而且我收到崩潰錯誤。

我究竟做錯了什么?

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

mainWindow.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 delection將刪除你的用戶界面和所有的附加部件YUR在construstor定義。 這樣,您可以避免調用closeWindow()方法。

delete ui也沒有必要。

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

我正在嘗試制作基本的文本編輯器,當觸發“新建”時,它將為新的文本文檔打開一個新窗口。 有更好的方法嗎?

是。 它稱為工廠 ,它可以是靜態方法,因為它不對任何對象進行操作。 當然,您可以從插槽中調用它。

我想您需要將文件名傳遞給新創建的窗口-這可以是factory方法和factory slot的參數。 如果“新”窗口為空,則這不是問題。

其他事宜:

  1. 沒有理由保留mainWidget成員:它始終可以作為centralWidget()

  2. 除了ui ,沒有理由讓其他成員作為指針。 這實際上是過早的悲觀化-它將浪費更多的堆內存。

  3. 如果中央小部件沒有子小部件,則不需要布局。 QTextEdit實例本身可以是中央窗口小部件。

  4. ui實例應使用智能指針保留。 這使析構函數完全由編譯器生成(它具有一個空主體)。

  5. 您在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();

您正在嘗試銷毀它們,並為下一次打開分配幾乎相同的方式。

您在這里實現的基本上是性能損失。 我建議隱藏,修改等等不需要的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM