[英]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的參數。 如果“新”窗口為空,則這不是問題。
其他事宜:
沒有理由保留mainWidget
成員:它始終可以作為centralWidget()
。
除了ui
,沒有理由讓其他成員作為指針。 這實際上是過早的悲觀化-它將浪費更多的堆內存。
如果中央小部件沒有子小部件,則不需要布局。 QTextEdit
實例本身可以是中央窗口小部件。
ui
實例應使用智能指針保留。 這使析構函數完全由編譯器生成(它具有一個空主體)。
您在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.