0

这是我的代码:

//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();
}

是否更有效(这里是“Q[Objects] VS using Pointers?”问题的一部分):

1)像我实际做的那样使用指针或

2)使用对象(去掉*+delete语句)

谢谢!

4

3 回答 3

6
MainWindow::MainWindow(QWidget *parent)
{
textEdit = new QTextEdit(this);
}

MainWindow::~MainWindow()
{
}
于 2011-09-22T01:18:45.970 回答
2

对于QObject作为指针的成员,你不应该使用deleteQTextEdit可能是 的孩子MainWindow,所以它会被自动删除。

当然,理论上使用非指针QObject成员会更快,并且间接级别少。像这样(对于那些不明白这个问题的人):

class MainWindow : public QMainWindow {
   ...
private:
   QTextEdit textEdit;
};

并且输入的代码也更少,因为您不必重新输入成员的类名来在构造函数中初始化它们。

但是由于QObject他们自己已经大量使用间接(使用他们的d-pointer),因此收益可能可以忽略不计。您使用指针成员键入的额外代码允许您在头文件和 Qt 之间具有较低的耦合,因为您可以使用前向声明而不是头包含,这意味着更快的编译(特别是如果您还没有使用预编译的头文件)和重新编译。

还,

  • 手动删除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首先被销毁textEditscrollArea还包括它的子元素textEdit,所以textEdit被有效地销毁两次导致崩溃。

所以使用成员作为指针更不容易出错QObject,并且不删除QObject自己有父级的成员。

于 2011-09-26T03:35:04.033 回答
1

尝试在堆栈上创建 QLineEdit,然后将其放入布局中...退出您的应用程序...您看到了什么?提示:在调试器中启动您的应用程序。

ksming 关于阅读文档是正确的。这不是特定于语言的问题。如果您要问什么更快:堆或堆栈分配,然后正确地提出您的问题。

于 2011-09-23T10:20:40.387 回答