这是我的代码:
//MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QTextEdit *textEdit;
};
#endif // MAINWINDOW_H
// MainWindow.cpp
#include "mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
{
textEdit = new QTextEdit();
}
MainWindow::~MainWindow()
{
delete textEdit;
}
//main.cpp
#include <QtGui>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
谢谢!
答案 0 :(得分:6)
MainWindow::MainWindow(QWidget *parent)
{
textEdit = new QTextEdit(this);
}
MainWindow::~MainWindow()
{
}
答案 1 :(得分:2)
对于QObject
成员作为指针,您不应使用delete
,QTextEdit
可能是MainWindow
的孩子,因此会自动删除。< / p>
理论上,使用非指针QObject
成员理论上会更快,间接级别更低。像这样(对于那些不理解这个问题的人):
class MainWindow : public QMainWindow {
...
private:
QTextEdit textEdit;
};
并且输入的代码也更少,因为您不必重新键入成员的类名以在构造函数中初始化它们。
但由于QObject
本身已经大量使用间接(使用d-pointer),因此增益可能微不足道。使用指针成员键入的额外代码允许您在头文件和Qt之间使用lower coupling,因为您可以使用前向声明而不是包含头,这意味着更快的编译(特别是如果您不使用预编译的头文件)然而)和重新编译。
另外,
QObject
指针成员或QObject
声明为非指针成员可以导致双重删除,如果你没有按正确的顺序分别删除/声明它们(孩子然后父母删除,或父母然后孩子申报)。
例如:
class MainWindow : public QMainWindow {
...
private:
QTextEdit textEdit;
QScrollArea scrollArea;
};
MainWindow::MainWindow() {
setCentralWidget(&scrollArea);
QWidget *scrolledWidget = new QWidget(&scrollArea);
QVBoxLayout *lay = new QVBoxLayout(scrolledWidget);
lay->addWidget(...);
lay->addWidget(&textEdit); // textEdit becomes a grand-child of scrollArea
scrollArea.setWidget(scrolledWidget);
}
删除MainWindow
时,其非静态类成员将按其在类中声明的相反顺序删除。因此,scrollArea
会先被textEdit
销毁,但scrollArea
也会销毁其子级,包括textEdit
,因此textEdit
会被有效销毁两次,导致崩溃。
因此,使用QObject
成员作为指针并且不删除自己拥有父级的QObject
的错误就不那么容易了。
答案 2 :(得分:1)
尝试在堆栈上创建QLineEdit然后将其放入布局中...退出应用程序...你看到了什么?提示:在调试器中启动应用程序。
ksming关于阅读文档是正确的。这不是语言特定的问题。如果你问的是什么更快:堆或堆栈分配,那么正确地形成你的问题。