Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

05 discardCommand << "rm" << fileName;

06 sessionManager.setDiscardCommand(discardCommand);

07 }

В системе X11 функция saveState вызывается, когда менеджер сеансов собирается сохранить состояние приложения. Данная функция также имеется на других платформах, но никогда не вызывается. Параметр QSessionManager позволяет нам поддерживать связь с менеджером сеансов.

Мы начинаем с попытки сохранения виджетом TicTacToe своего состояния в некоторый файл. Затем мы задаем команду для выполнения сброса состояния менеджером сеансов. Команда сброса (discard command) — это команда, которую должен выполнять менеджер сеансов для удаления любой сохраненной ранее информации, связанной с текущим состоянием. В этом примере мы задаем ее в виде

rm файл_сеанса

где файл_сеанса — имя файла, который содержит сохраненное состояние сеанса, a rm — стандартная команда удаления файлов в системе Unix.

Менеджер сеансов имеет также команду рестарта (restart command). Эту команду менеджер сеансов должен выполнять для возобновления работы приложения. По умолчанию Qt обеспечивает следующую команду рестарта:

приложение – session идентификатор_ключ

Первая часть, приложение, извлекается из argv[0]. Идентификатор — это идентификатор сеанса, переданный менеджером сеансов; гарантированно обеспечивается его уникальность для различных приложений и различных сеансов работы одного приложения. Ключ добавляется для однозначной идентификации времени сохранения сеанса. По различным причинам менеджер сеансов может вызывать функцию saveState несколько раз в одном сеансе, и различные состояния должны отличаться.

Из-за ограничений существующих менеджеров сеансов нам необходимо убедиться, что каталог приложения содержится в переменной среды PATH, если мы хотим обеспечить правильный рестарт приложения. В частности, если вы сами собираетесь попробовать пример TicTacToe, вы должны установить его в каталог, например, /usr/bin и вызывать его по команде tictactoe.

Для простых приложений, в том числе и для TicTacToe, мы могли бы для обеспечения команды рестарта сохранять состояние в дополнительном аргументе командной строки. Например:

tictactoe -state 0X-X0-X-0

Это избавило бы нас от сохранения данных в файле и выдачи команды сброса состояния для удаления файла.

01 void Application::commitData(QSessionManager &sessionManager)

02 {

03 if (ticTacToe->gameInProgress

04 && sessionManager.allowsInteraction) {

05 int r = QMessageBox::warning(ticTacToe, tr("Tic-Tac-Toe"),

06 tr("The game hasn't finished.\n"

07 "Do you really want to quit?"),

08 QMessageBox::Yes | QMessageBox::Default,

09 QMessageBox::No | QMessageBox::Escape);

10 if (г == QMessageBox::Yes) {

11 sessionManager.release;

12 } else {

13 sessionManager.cancel;

14 }

15 }

16 }

Функция commitData вызывается, когда пользователь выходит из системы. Мы можем переопределить ее для вывода сообщения, предупреждающего пользователя о потенциальной потере данных. В используемой по умолчанию реализации закрываются все виджеты верхнего уровня, что равносильно ситуации, когда пользователь последовательно закрывает все окна, нажимая кнопку закрытия в заголовках окон. В главе 3 мы показали, как можно переопределять функцию closeEvent, перехватывающую этот момент и выводящую на экран сообщение.

Рис. 20.9. «Вы действительно хотите завершить работу?».

Теперь давайте рассмотрим класс TicTacToe:

01 class TicTacToe : public QWidget

02 {

03 Q_OBJECT

04 public:

05 TicTacToe(QWidget *parent = 0);

06 bool gameInProgress const;

07 QString saveState const;

08 QSize sizeHint const;

09 protected:

10 void paintEvent(QPaintEvent *event);

11 void mousePressEvent(QMouseEvent *event);

12 private:

13 enum { Empty = '-', Cross = 'X', Nought = '0' };

14 void clearBoard;

15 void restoreState;

16 QString sessionFileName const;

17 QRect cellRect(int row, int column) const;

  • Читать дальше
  • 1
  • ...
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: