Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 108

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

ВСрнСмся ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ класса AddressBook. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² макроса Q_CLASSINFO() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странным. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ элСмСнты управлСния ActiveX ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π² распоряТСниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свои собствСнныС свойства, сигналы ΠΈ слоты, Π½ΠΎ ΠΈ свои супСрклассы Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ QWidget. Атрибут ToSuperClass позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ супСркласс самого высокого уровня (Π² Π΄Π΅Ρ€Π΅Π²Π΅ наслСдования), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собираСмся ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ имя класса ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (Β«AddressBookΒ») Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ экспортируСмого класса самого высокого уровня β€” это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ свойства, сигналы ΠΈ слоты, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² супСрклассах AddressBook.

01 class ABItem : public QObject, public QListViewItem

02 {

03 Q_OBJECT

04 Q_PROPERTY(QString contact READ contact WRITE setContact)

05 Q_PROPERTY(QString address READ address WRITE setAddress)

06 Q_PROPERTY(QString phoneNumber

07 READ phoneNumber WRITE setPhoneNumber)

08 Q_CLASSINFO("ClassID",

09 "{bc82730e-5f39-4e5c-96be-461c2cd0d282}")

10 Q_CLASSINFO("InterfaceID",

11 "{c8bc1656-870e-48a9-9937-fbe1ceff8b2e}")

12 Q_CLASSINFO("ToSuperClass", "ABItem")

13 public:

14 ABItem(QTreeWidget *treeWidget);

15 void setContact(const QString &contact);

16 QString contact() const { return text(0); }

17 void setAddress(const QString &address);

18 QString address() const { return text(1); }

19 void setPhoneNumber(const QString &number);

20 QString phoneNumber() const { return text(2); }

21 public slots:

22 void remove();

23 };

Класс ABItem прСдставляСт ΠΎΠ΄ΠΈΠ½ элСмСнт Π² адрСсной ΠΊΠ½ΠΈΠ³Π΅. Он наслСдуСт QTreeWidgetItem ΠΈ поэтому ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² QTreeWidget, ΠΈ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ наслСдуСт QObject ΠΈ поэтому ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ БОМ.

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 if (!QAxFactory::isServer()) {

05 AddressBook addressBook;

06 addressBook.show();

07 return app.exec();

08 }

09 return app.exec();

10 }

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΌΡ‹ провСряСм, Π² ΠΊΠ°ΠΊΠΎΠΌ качСствС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ сСрвСр. ΠžΠΏΡ†ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки β€”activex распознаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ QApplication ΠΈ обСспСчиваСт Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния Π² качСствС сСрвСра. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ являСтся сСрвСром, ΠΌΡ‹ создаСм Π³Π»Π°Π²Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π½Π° экран, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ для любого Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ прилоТСния Qt.

ΠšΡ€ΠΎΠΌΠ΅ ΠΎΠΏΡ†ΠΈΠΈ β€”activex сСрвСры ActiveX Β«ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚Β» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

β€’ β€”regserver β€” рСгистрация сСрвСра Π² систСмном рССстрС;

β€’ β€”unregserver β€” ΠΎΡ‚ΠΌΠ΅Π½Π° рСгистрации сСрвСра Π² систСмном рССстрС;

β€’ β€”dumpidl Ρ„Π°ΠΉΠ» β€” записываСт описаниС сСрвСра Π½Π° языкС IDL (Interface Description Language β€” язык описания интСрфСйсов) Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСрвСра, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы AddressBook ΠΈ ABItem ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ БОМ:

QAXFACTORY_BEGIN("{2b2b6f3e-86cf-4c49-9df5-80483b47f17b}",

"{8e827b25-148b-4307-ba7d-23f275244818}")

QAXCLASS(AddressBook)

QAXTYPE(ABItem)

QAXFACTORY_END()

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ макросы ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ классов для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² БОМ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ собираСмся ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² БОМ, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос QAXFACTORY_DEFAULT(), ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ макроса QAXFACTORY_BEGIN() являСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ²; Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ прСдставляСт собой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прилоТСния. ΠœΠ΅ΠΆΠ΄Ρƒ макросами QAXFACTORY_BEGIN() ΠΈ QAXFACTORY_END() ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ всС классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ инстанцированы, ΠΈ всС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, доступныС ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ БОМ.

НиТС приводится Ρ„Π°ΠΉΠ» .pro для внСпроцСссного сСрвСра ActiveX:

TEMPLATE = app

CONFIG += qaxserver

HEADERS = abitem.h \

addressbook.h \

editdialog.h

SOURCES = abitem.cpp \

addressbook.cpp \

editdialog.cpp \

main.cpp

FORMS = editdialog.ui

RC_FILE = qaxserver.rc

Π€Π°ΠΉΠ» qaxserver.rc, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ имССтся ссылка Π² Ρ„Π°ΠΉΠ»Π΅ .pro, являСтся стандартным Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ скопирован ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Qt src\activeqt\control.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² vb ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Visual Basic, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСрвСр Address Book.

Π­Ρ‚ΠΈΠΌ ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ наш ΠΎΠ±Π·ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ срСды ActiveQt. Дистрибутив Qt Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ содСрТится информация ΠΎ способах построСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ QAxContainer ΠΈ QAxServer ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… вопросов взаимодСйствия.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСансами Π² систСмС X11

Когда ΠΌΡ‹ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· систСмы X11, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ нас ΠΎ нСобходимости сохранСния сСанса. Если ΠΌΡ‹ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ ΡƒΡ‚Π²Π΅Ρ€Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π΅ Π² систСму Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° с Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ экрана ΠΈ, Π² идСальном случаС, с Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ состояния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²ΠΎ врСмя Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ систСмы X11, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт сохранСниС ΠΈ восстановлСниС сСанса, называСтся ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ сСансов (session manager). Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Qt/X11 «осознавало» присутствиС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° сСансов, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QApplication::saveState() ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΌ состояниС прилоТСния.

Рис. 20.7. Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· систСмы KDE.

Windows 2000 ΠΈ XP, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ систСмы Unix ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ носит Π½Π°Π·Π²Π°Π½ΠΈΠ΅ «спящих процСссов» (hibernation). Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ останавливаСт ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, опСрационная систСма просто Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π° диск ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ «просыпаСтся». ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈ ΠΎΠ½ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом.

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ пСрСопрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QApplication::commitData(). Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΈ нСобходимости Π²ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ схСмы управлСния сСансом поддСрТиваСтся ΠΊΠ°ΠΊ Π² систСмС X11, Ρ‚Π°ΠΊ ΠΈ Π² Windows.

ΠœΡ‹ рассмотрим ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСансом Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ прилоТСния Tic-Tac-Toe (крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° сСансов. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main():

01 int main(int argc, char *argv[])

02 {

03 Application app(argc, argv);

04 TicTacToe toe;

05 toe.setObjectName("toe");

06 app.setTicTacToe(&toe);

07 toe.show();

08 return app.exec();

09 }

ΠœΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Application. Класс Application наслСдуСт QApplication ΠΈ пСрСопрСдСляСт Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ commitData() ΠΈ saveState() для обСспСчСния управлСния сСансом.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ TicTacToe, Π΄Π°Π΅ΠΌ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Application ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ. ΠœΡ‹ Π΄Π°Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ TicTacToe имя Β«toeΒ». ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ сСансов ΠΌΠΎΠ³ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠΊΠΎΠ½.

Рис. 20.8. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Tic-Tac-Toe.

НиТС приводится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Application:

01 class Application : public QApplication

02 {

03 Q_OBJECT

04 public:

05 Application(int &argc, char *argv[]);

06 void setTicTacToe(TicTacToe *tic);

07 void saveState(QSessionManager &sessionManager);

08 void commitData(QSessionManager &sessionManager);

09 private:

10 TicTacToe *ticTacToe;

11 };

Класс Application сохраняСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° TicTacToe Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

01 void Application::saveState(QSessionManager &sessionManager)

02 {

03 QString fileName = ticTacToe->saveState();

04 QStringList discardCommand;

05 discardCommand << "rm" << fileName;

06 sessionManager.setDiscardCommand(discardCommand);

07 }

Π’ систСмС X11 функция saveState() вызываСтся, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ сСансов собираСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ состояниС прилоТСния. Данная функция Ρ‚Π°ΠΊΠΆΠ΅ имССтся Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ вызываСтся. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ QSessionManager позволяСт Π½Π°ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ связь с ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ сСансов.

ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ сохранСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ TicTacToe своСго состояния Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для выполнСния сброса состояния ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ сСансов. Команда сброса (discard command) β€” это ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ сСансов для удалСния любой сохранСнной Ρ€Π°Π½Π΅Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, связанной с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ состояниСм. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π΅Π΅ Π² Π²ΠΈΠ΄Π΅

rm Ρ„Π°ΠΉΠ»_сСанса

Π³Π΄Π΅ Ρ„Π°ΠΉΠ»_сСанса β€” имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит сохранСнноС состояниС сСанса, a rm β€” стандартная ΠΊΠΎΠΌΠ°Π½Π΄Π° удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π² систСмС Unix.