(Qt Creator - 基于Cpp的应用程序)Q <objects> VS使用指针?</objects>

时间:2011-09-22 01:02:22

标签: c++ qt pointers qobject

这是我的代码:

//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使用指针?”问题的一部分):

1)使用我正在做的指针或

2)使用对象(删除* +删除语句)

谢谢!

3 个答案:

答案 0 :(得分:6)

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

MainWindow::~MainWindow()
{
}

答案 1 :(得分:2)

对于QObject成员作为指针,您不应使用deleteQTextEdit可能是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关于阅读文档是正确的。这不是语言特定的问题。如果你问的是什么更快:堆或堆栈分配,那么正确地形成你的问题。