Как показать окно в 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++ был бы немного уродливым, потому что после этого никто не очистит. Я попробовал следующие вещи:

  1. shared_ptr. Не повезло, окно deleteд, Как только способ заканчивается, что означает, что новое окно появляется на долю секунды и исчезает снова. Не очень хороший.

  2. exec() вместо show(). Это будет работать для модальных диалогов, но документация казалось, подразумевается, что он также останавливает цикл событий и что вы должны вызвать QApplication::processEvents() регулярно, если он все еще нуждается в обновлении. Я мало что понимаю здесь, но думаю, что это тоже не слишком хорошо.

  3. 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, как только вы закроете диалоговое окно.