Я следую Учебникам Qt и получил простой вопрос

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

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

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

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

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


person nzer0    schedule 12.05.2010    source источник


Ответы (4)


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

person Jason B    schedule 12.05.2010

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

1 Как уже упоминалось, если родитель не нулевой, ваш виджет будет отображаться только внутри родительского виджета.

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< /а>

person VestniK    schedule 12.05.2010

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

Удачи!

person mosg    schedule 12.05.2010

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

person darklon    schedule 17.09.2011