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もちろん、間接参照のレベルが1つ少ない、非ポインターメンバーを使用する方が理論的には高速です。このように(質問を理解していなかった人のために):

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

また、コンストラクターでメンバーを初期化するためにメンバーのクラス名を再入力する必要がないため、入力するコードも少なくなります。

しかし、QObjectそれ自体がすでに間接参照を(dポインターを使用して)頻繁に使用しているため、ゲインはおそらく無視できるでしょう。また、ポインターメンバーを使用して入力する追加のコードを使用すると、ヘッダーファイルと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最初に破壊されますが、を含むその子も破壊されるため、効果的に2回破壊され、クラッシュが発生します。textEditscrollAreatextEdittextEdit

QObjectしたがって、メンバーをポインターとして使用QObjectし、親を持つメンバーを自分で削除しないことで、エラーが発生しにくくなります。

于 2011-09-26T03:35:04.033 に答える
1

スタックに QLineEdit を作成してから、レイアウトに配置してみてください... アプリケーションを終了します... 何が見えますか? ヒント: アプリケーションをデバッガーで起動します。

ksming は、ドキュメントを読むことについて正しいです。言語固有の問題ではありません。ヒープ割り当てとスタック割り当てのどちらが速いかを尋ねている場合は、質問を適切に作成してください。

于 2011-09-23T10:20:40.387 に答える