2

私は Qt5 を初めて使用し、アプリケーションを開発するために QWidgets を学習しています。

多くの例で気づいたのですが、QWidgets はほとんどの場合ポインターによってアクセスされます。例えば:

#include <QApplication>
#include <QWidget>
#include <QFrame>
#include <QGridLayout>

class Cursors : public QWidget {

 public:
     Cursors(QWidget *parent = 0);
};

Cursors::Cursors(QWidget *parent)
    : QWidget(parent) {

  QFrame *frame1 = new QFrame(this);
  frame1->setFrameStyle(QFrame::Box);
  frame1->setCursor(Qt::SizeAllCursor);

  QFrame *frame2 = new QFrame(this);
  frame2->setFrameStyle(QFrame::Box);
  frame2->setCursor(Qt::WaitCursor);

  QFrame *frame3 = new QFrame(this);
  frame3->setFrameStyle(QFrame::Box);
  frame3->setCursor(Qt::PointingHandCursor);

  QGridLayout *grid = new QGridLayout(this);
  grid->addWidget(frame1, 0, 0);
  grid->addWidget(frame2, 0, 1);
  grid->addWidget(frame3, 0, 2);

  setLayout(grid);
}

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);  

  Cursors window;

  window.resize(350, 150);
  window.setWindowTitle("Cursors");
  window.show();

  return app.exec();
}

これはチュートリアルから取ったものです: http://zetcode.com/gui/qt5/firstprograms/

それでも、同じページで、オブジェクト自体によって QWidget 基本クラスにアクセスできることがわかります。

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    QWidget window;

    window.resize(250, 150);
    window.setWindowTitle("Simple example");
    window.show();

    return app.exec();
}

すべての QWidget 派生クラスにポインターでアクセスする必要があるのはなぜですか? ポインターで QWidget 自体にアクセスする必要がないのはなぜですか?

4

3 に答える 3

5

オブジェクトの存続期間と所有権の共有がすべてです。関数でスタックにオブジェクトを作成すると、スコープが終了すると破棄されます。

あなたの例では、ポインターで QWidget にアクセスする必要がないのはなぜですか? main() が「終了」すると、プログラムが終了し、ウィジェットが破棄される可能性があるためです。

QWidget の子にポインタでアクセスする必要があるのはなぜですか? QWidget にその子へのアクセスを許可するように依頼したい場合、オブジェクトの単なるコピーであるため、値を与えることができないためです。さらに、大きなオブジェクトを値で QWidget に渡す場合、オブジェクトをコピーする必要があります。

于 2015-11-12T06:43:57.303 に答える