Я повсюду видел синтаксис Qt GUI, подобный следующему:
myDialog::myDialog(QWidget *parent, Qt::WFlags flags):QDialog(parent, flags)
{
QPushButton *button = new QPushButton("&Download", this);
QVBoxLayout *layout = new QVBoxLayout(this);
//something that can throw here
layout ->addWidget(button );
setLayout(layout);
}
Я всегда задавался вопросом, может ли это произойти в случае исключения, потому что «this», которое я даю в качестве родителя для кнопки и макета, не полностью сконструировано, поэтому оно не может уничтожить его потомков.
Я попробовал это в MSVC2010 Qt4.8.3 и похоже, что как только базовый класс QObject полностью создан (что, конечно, делается в первую очередь), можно передать «this» другим объектам в конструкторе, они будут уничтожены правильно.
Хотя я не нашел места в документации по Qt, гарантирующего это, может ли кто-нибудь указать мне на это, так что я уверен, что это не изменится в будущем?
Я считаю, что это стандартный C ++, чтобы гарантировать, что базовый конструктор выполняется до производных конструкторов, хотя я не могу цитировать главу и стих из стандарта. Тем не менее, есть гарантия того, что Деструктор QObject всегда уничтожит всех потомков этого QObject.
Соглашение Qt состоит в том, что QObject, указатель которого передается конструктору QObject или QWidget, станет родителем вновь созданного объекта. Поэтому, когда вы проходите this
в button
Ctor, button
становится ребенком myDialog
, Поскольку часть QObject myDialog
будет уже построен в то время, я полагаю, что вы можете смело полагаться на эту функциональность.
РЕДАКТИРОВАТЬ: я должен добавить, что в приведенном выше примере, хотя button
начинается как ребенок myDialog
из-за конструктора он перерисовывается при добавлении в layout
и становится внучкой myDialog
, который все еще должен быть удален его деструктором QObject.
Других решений пока нет …