Обработка выхода без сохранения в Qt

Я студент-программист, использующий Qt для сборки и приложения для работы, и мне трудно понять, что делать, когда пользователь выходит из диалогового окна без сохранения изменений. Диалоговое окно в первую очередь предназначено для ввода данных, поэтому возможность определить, были ли внесены изменения, а затем предложить пользователю возможность сохранить перед выходом, было бы чрезвычайно полезно. Я просмотрел документацию Qt по QDialog и ничего не нашел в отношении режима, который возвращается, если нажата кнопка выхода. Наличие средств, позволяющих просто определить, когда нажата кнопка выхода, является первоочередной задачей. Кроме того, будучи студентом-программистом, я также открыт для любых идей относительно лучших практик в отношении того, как я должен сравнивать данные до и после. Данные вводятся в таблицу, поэтому я предполагаю, что мне придется сделать что-то вроде этого

connect(some kinda exit handler, SIGNAL(clicked), this, SLOT(comparePreAndPostTable)

QVector<QString> prechanges =  everything from the table
QVector<QString> postchanges = everything from table when exit is clicked


if(prechanges != postchanges)
{
     Give oppertunity to save
}

Любая помощь приветствуется! Было бы здорово, если бы в Qt уже было что-то для этого!


person Wylie Coyote SG.    schedule 02.05.2012    source источник
comment
В дополнение к тому, что сказал talnicolas, я рекомендую поэкспериментировать с QWidget::setWindowModified() и QWidget::isWindowModified(). Вы можете установить для свойства значение true всякий раз, когда пользователь что-то делает с документом, и в методе close проверить, верно ли это. Это также может поместить удобную звездочку (по крайней мере, в Windows) в строке заголовка, чтобы пользователь мог видеть, был ли документ отредактирован или нет.   -  person Anthony    schedule 02.05.2012


Ответы (1)


Вам необходимо переопределить метод closeEvent() QWidget для обработки выхода кнопка вашего диалога. В документации даже приведен пример, который странно выглядит как то, что вы ищете:

 void MainWindow::closeEvent(QCloseEvent *event)
 {
     if (maybeSave()) {
         writeSettings();
         event->accept();
     } else {
         event->ignore();
     }
 }

где maybeSave() будет сравниваться, чтобы увидеть, изменилось ли что-нибудь.

person talnicolas    schedule 02.05.2012