Я следую Qt Tutorials и получил простой вопрос - PullRequest
2 голосов
/ 12 мая 2010

Если я хочу создать свой собственный класс MyWidget, который наследуется от QWidget

Учебник говорит мне написать конструктор вот так ...

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

Мне интересно, какова роль: QWidget (родитель)

Означает ли это явный вызов конструктора QWidget?

Ответы [ 4 ]

5 голосов
/ 12 мая 2010

Да. В C ++, если вам нужно явно вызвать конструктор базового класса в списке инициализации вашего конструктора , если вы хотите, чтобы он выполнялся. В этом случае QWidget(parent) будет запущено до запуска кода в вашем конструкторе. Кстати, это не просто вещь Qt, а обычное наследование в C ++.

2 голосов
/ 12 мая 2010

В дополнение к предыдущему ответу:

1 Как уже упоминалось, если родительский элемент не равен 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

0 голосов
/ 17 сентября 2011

Это называется списком инициализации в C ++, и да, это явный вызов конструктора QWidget. По умолчанию C ++ вызывает версию конструкторов своих базовых классов без аргументов, если в списке инициализации нет явного вызова. Обычно считается хорошим замыслом, что инициализация членов класса обрабатывается конструктором этого класса - Qt следует этому соглашению. Итак, здесь вы передаете указатель на конструктор своего базового класса, чтобы он мог сохранить его в одной из своих переменных-членов.

0 голосов
/ 12 мая 2010

Из "ваш" Учебное пособие по Qt: Поскольку этот класс наследует от QWidget, новый класс является виджетом и может быть окном верхнего уровня или дочерним виджетом (как QPushButton в предыдущей главе) .

Удачи!

...