2

如果我想创建自己的类 MyWidget 继承自 QWidget

教程告诉我写这样的构造函数......

MyWidget::MyWidget(QWidget *parent)
: QWidget(parent){....}

我想知道它的作用是什么:QWidget(parent)

这是否意味着显式调用 QWidget 的构造函数?

4

4 回答 4

5

是的。在 C++ 中,如果您希望它运行,则必须在构造函数的初始化列表中显式调用基类的构造函数。在这种情况下,QWidget(parent)将在运行构造函数中的代码之前运行。顺便说一句,这不仅仅是 Qt 的事情,而且在 C++ 继承中很常见。

于 2010-05-12T14:04:32.360 回答
2

除了上一个答案:

1 就像提到的,如果 parent 不为 null,您的小部件将仅在父小部件内呈现。

2 如果父小部件被删除,您的所有子小部件也将被删除操作员删除。

默认小部件构造函数的正确实现应该如下:

class MyWidget: public QWidget {
    Q_OBJECT
    public:
        explicit MyWidget(QWidget *parent = 0);
}

MyWidget::MyWidget(QWidget *parent = 0): QWidget(parent) {
    // Your own initialization code
}

尽量避免为堆栈小部件指定非零父级。您最好始终以以下方式创建嵌套小部件:

QWidget *parentWidget;
MyWidget myWidget = new MyWidget(parentWidget);

你可以在这里阅读更多:http: //doc.trolltech.com/4.6/objecttrees.html

于 2010-05-12T14:11:47.593 回答
0

来自“你的” Qt 教程:因为这个类继承自 QWidget,所以新类是一个小部件,可能是顶级窗口或子小部件(如上一章中的 QPushButton)

祝你好运!

于 2010-05-12T13:59:46.960 回答
0

这在 C++ 中称为初始化列表,是的,它是对 QWidget 构造函数的显式调用。默认情况下,C++ 调用其基类构造函数的无参数版本,除非在初始化列表中有显式调用。通常认为类成员的初始化由该类的构造函数处理是好的设计 - Qt 遵循此约定。因此,在这里您传递了一个指向其基类构造函数的指针,因此它可以将其存储在其成员变量之一中。

于 2011-09-17T13:18:11.687 回答