Как показать окно в Qt и удалить его, как только она закрыта?
в качестве очень простого примера я хочу показать диалог в Qt при нажатии кнопки. Обычный шаблон для этого (в приложении, над которым я сейчас работаю) выглядит следующим образом:
class MainWindow {
...
private slots:
buttonClicked();
...
private:
ChildWindow * childWindow;
}
MainWindow::MainWindow(QWidget * parent) : QWidget(parent) {
...
childWindow = new ChildWindow(this);
...
}
MainWindow::buttonClicked() {
childWindow.show();
}
исходя из .NET и Windows Forms (и потому, что мне не нужен доступ к этому объекту из другого места в классе), следующий шаблон мне более знаком:
button1_Clicked(object sender, EventArgs e) {
ChildWindow f = new ChildWindow();
f.Show();
}
локальная переменная означает, что у меня нет еще одного поля экземпляра, а также что окно не задержитесь в памяти дольше, чем необходимо. Прямой перевод этого на C++ был бы немного уродливым, потому что после этого никто не очистит. Я попробовал следующие вещи:
shared_ptr. Не повезло, окноdeleteд, Как только способ заканчивается, что означает, что новое окно появляется на долю секунды и исчезает снова. Не очень хороший.exec()вместоshow(). Это будет работать для модальных диалогов, но документация казалось, подразумевается, что он также останавливает цикл событий и что вы должны вызватьQApplication::processEvents()регулярно, если он все еще нуждается в обновлении. Я мало что понимаю здесь, но думаю, что это тоже не слишком хорошо.deleteLater(). К сожалению, просто показ окна не блокируетdeleteLaterпоэтому он исчезает, как только появляется.
есть ли хороший вариант, чтобы просто очистить после окна, когда я закрываю его?
2 ответов
childWindow->setAttribute( Qt::WA_DeleteOnClose );
Также обратите внимание, что вызов exec() блокирует выполнение цикла вызывающего события, но порождает собственный цикл событий, поэтому никаких вызовов processEvents() должно быть необходимым.
вы можете подключить finished() сигнал th диалога к его deleteLater слот:
ChildWindow * d = new ChildWindow(this);
connect(d, SIGNAL(finished(int)), d, SLOT(deleteLater()));
d->show();
таким образом это будет deleted, как только вы закроете диалоговое окно.