Как показать окно в 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();
таким образом это будет delete
d, как только вы закроете диалоговое окно.