В качестве очень простого примера я хочу показать диалог в 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
d, как только метод завершается, что означает, что новое окно появляется на долю секунды и снова исчезает. Не так хорошо, как хотелось бы.exec()
вместоshow()
. Это будет работать для модальных диалогов, но документация, похоже, подразумевает, что это также останавливает цикл событий и что вы должны регулярно вызыватьQApplication::processEvents()
, если его все еще нужно обновить. Я понимаю здесь достаточно мало, но, думаю, это тоже не слишком приятно.deleteLater()
. К сожалению, просто показ окна не блокируетdeleteLater
, поэтому оно исчезает, как только появляется.
Есть ли хороший вариант просто убрать за окном, когда я его закрываю?