QT 4: программирование GUI на С++ | страница 51



>01 bool MainWindow::save()

>02 {

>03 if (curFile.isEmpty()) {

>04 return saveAs();

>05 } else {

>06 return saveFile(curFile);

>07 }

>08 }


>09 bool MainWindow::saveFile(const QString &fileName)

>10 {

>11 if (!spreadsheet->writeFile(fileName)) {

>12 statusBar()->showMessage(tr("Saving canceled"), 2000);

>13 return false;

>14 }

>15 setCurrentFile(fileName);

>16 statusBar()->showMessage(tr("File saved"), 2000);

>17 return true;

>18 }

Слот save() соответствует пункту меню File | Save. Если файл уже имеет имя, потому что уже открывался до этого или уже сохранялся, слот save() вызывает saveFile(), задавая это имя; в противном случае он просто вызывает saveAs().

>01 bool MainWindow::saveAs()

>02 {

>03 QString fileName = QFileDialog::getSaveFileName(this,

>04 tr("SaveSpreadsheet"),

>05 tr("Spreadsheet files (*.sp)"));

>06 if (fileName.isEmpty())

>07 return false;

>08 return saveFile(fileName);

>09 }

Слот saveAs() соответствует пункту меню File | Save As. Мы вызываем QFileDialog::getSaveFileName() для получения имени файла от пользователя. Если пользователь нажимает кнопку Cancel, мы возвращаем значение false, которое передается дальше вплоть до вызвавшей функции (save() или okToContinue()).

Если файл с данным именем уже существует, функция getSaveFileName() попросит пользователя подтвердить его перезапись. Такое поведение можно предотвратить, передавая функции getSaveFileName() дополнительный аргумент QFileDialog::DontConfirmOverwrite.

>01 void MainWindow::closeEvent(QCloseEvent *event)

>02 {

>03 if (okToContinue()) {

>04 writeSettings();

>05 event->accept();

>06 } else {

>07 event->ignore();

>08 }

>09 }

Когда пользователь выбирает пункт меню File | Exit или щелкает по кнопке X заголовка окна, вызывается слот QWidget::close(). В результате будет сгенерировано событие виджета «close» (закрытие). Переопределяя функцию QWidget::closeEvent(), мы можем перехватывать команды по закрытию главного окна и принимать решения относительно возможности его фактического закрытия.

Если изменения не сохранены и пользователь нажимает кнопку Cancel, мы «игнорируем» это событие, и оно никак не повлияет на окно. В обычном случае мы реагируем на это событие, и в результате Qt закроет окно. Мы вызываем также закрытую функцию writeSettings() для сохранения текущих настроек приложения.