Qt 主窗口崩溃
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
主窗口.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);
我正在尝试制作基本的文本编辑器,当触发新文本时,它应该为新文本文档打开一个新窗口。有没有更好的方法可以做到这一点?
是的。它被称为工厂,它可以是一个静态方法,因为它不对任何对象进行操作。当然,您可以从插槽中调用它。
我想您需要将文件名传递给新创建的窗口 - 这可能是工厂方法和工厂插槽的参数。如果"新"窗口为空,则这不是问题。
其他问题:
-
没有理由保留
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();
您正在尝试销毁它们,并且在下一次打开时,您几乎以相同的方式分配它们。
你在这里实现的基本上是性能损失。我建议隐藏,修改等不需要的项目。
- Opencv在2013年第5季度不起作用.应用程序总是在窗口中崩溃
- 为什么抓取窗口标题的代码会导致应用崩溃?
- 如何在程序崩溃时关闭程序,没有任何警告屏幕等.C++窗口
- gdborig.exe 在调试 QT 5.8 并在窗口中打开 QFileDialog 时随机崩溃
- 尝试打开 SDL2 窗口时与 D-Bus 相关的运行时崩溃
- 使用第二个线程快速更新 GUI 窗口会通过调整窗口大小或移动窗口而崩溃
- OpenCV在我移动命名窗口时崩溃
- Gtkmm应用程序在调整窗口大小时在Windows 8.1上崩溃
- GDI 窗口中的游戏循环/一段时间后不刷新并崩溃
- MFC 程序崩溃时调整窗口大小并出现错误"A required resource was not found."
- 在自定义控件中创建子按钮窗口后崩溃
- WaitForMultipleObjects 在 64 位窗口上崩溃
- 关闭康科尔窗口会导致崩溃
- 在多个窗口中使用全局QNetworkCookieJar时,应用程序崩溃
- 打开窗口qt时应用程序崩溃
- SDL2在调整窗口大小时崩溃
- 通过firefox p11模块打开Wxwidget窗口时崩溃
- Emacs 24.3.1, Ubuntu 14.04.1 LTS, gdb在Emacs中的窗口切换都崩溃了
- SFML(C++)在创建窗口时崩溃?[SFML:1.6,CB:12.11]
- 在Windows Vista/View Studio 2005中,应用程序崩溃弹出窗口中没有JIT调试器的“调试”选项