为什么QWidgets被指针访问?

sho*_*ory 2 c++ qt pointers qtwidgets

我是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();
}
Run Code Online (Sandbox Code Playgroud)

这是从教程中获取的: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();
}
Run Code Online (Sandbox Code Playgroud)

为什么必须通过它们的指针访问所有QWidget派生类?为什么没有必要通过其指针访问QWidget本身?

V. *_*nko 5

这与对象的生命周期和共享所有权有关。如果在函数中的堆栈上创建对象,则作用域结束时它将被销毁。

为什么在示例中不需要通过指针访问QWidget?仅仅因为main()“结束”,您的程序就完成了,并且小部件可能被破坏了。

为什么必须通过指针访问QWidget的子级?因为如果您想让QWidget允许您访问它的子项,它就不能给您一个值,因为它只是对象的一个​​副本。此外,如果按值将大对象传递给QWidget,则它需要复制对象。


jbm*_*jbm 5

这不是 QWidgets 特有的:对于每个 QObjects(Qt 基本基类,其他所有东西都是从它派生的)都是如此。

这是 Qt 框架设计选择的结果。引用 Qt 文档:

QObject 既没有复制构造函数也没有赋值运算符。这是设计使然。

[...]

主要的后果是您应该使用指向 QObject(或您的 QObject 子类)的指针,否则您可能会试图将 QObject 子类用作值。例如,如果没有复制构造函数,则不能使用 QObject 的子类作为要存储在容器类之一中的值。您必须存储指针。

来源:

http://doc.qt.io/qt-5.5/qobject.html#no-copy-constructor

此处解释了此选择的基本原理:

http://doc.qt.io/qt-5.5/object.html#identity-vs-value