【发布时间】:2011-02-18 15:23:49
【问题描述】:
如果我想创建自己的类 MyWidget,它继承自 QWidget
教程告诉我这样写构造函数...
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent){....}
我想知道:QWidget(parent)的作用是什么
这是否意味着显式调用 QWidget 的构造函数?
【问题讨论】:
标签: qt constructor qt4 colon
如果我想创建自己的类 MyWidget,它继承自 QWidget
教程告诉我这样写构造函数...
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent){....}
我想知道:QWidget(parent)的作用是什么
这是否意味着显式调用 QWidget 的构造函数?
【问题讨论】:
标签: qt constructor qt4 colon
是的。在 C++ 中,如果您希望它运行,则必须在构造函数的 initialization list 中显式调用基类的构造函数。在这种情况下,QWidget(parent) 将在运行构造函数中的代码之前运行。顺便说一句,这不仅仅是 Qt 的事情,而且在 C++ 继承中很常见。
【讨论】:
除了上一个答案:
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
【讨论】:
来自"yours"Qt教程:因为这个类继承自QWidget,所以新的类是一个widget,可能是顶层窗口,也可能是子widget(如上一章的QPushButton)。
祝你好运!
【讨论】:
这在 C++ 中称为初始化列表,是的,它是对 QWidget 构造函数的显式调用。默认情况下,C++ 调用其基类构造函数的无参数版本,除非在初始化列表中有显式调用。通常认为类成员的初始化由该类的构造函数处理被认为是好的设计 - Qt 遵循此约定。所以,在这里你传递一个指向它的基类的构造函数的指针,所以它可以将它存储在它的一个成员变量中。
【讨论】: