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

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

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

МногиС прилоТСния ΠΏΡ€ΠΈ запускС выводят Π½Π° экран заставки. НСкоторыми Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ заставки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ запуск прилоТСния, Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях это дСлаСтся для удовлСтворСния Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π° ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³. МоТно ΠΎΡ‡Π΅Π½ΡŒ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ заставку Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Qt, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ класс QSplashScreen.

Класс QSplashScreen Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ появлСния Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сообщСниС, ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎ Ρ…ΠΎΠ΄Π΅ процСсса ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·ΠΎΠ² заставки дСлаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QApplication::exec().

НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(), которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ QSplashScreen для Π²Ρ‹Π²ΠΎΠ΄Π° заставки прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ устанавливаСт сСтСвыС соСдинСния ΠΏΡ€ΠΈ запускС.

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

02 {

03 QApplication app(argc, argv);

04 QSplashScreen *splash = new QSplashScreen;

05 splash->setPixmap(QPixmap(":/images/splash.png"));

06 splash->show();

07 Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;

08 splash->showMessage(QObject::tr("Setting up the main window…"),

09 topRight, Qt::white);

10 MainWindow mainWin;

11 splash->showMessage(QObject::tr("Loading modules…"),

12 topRight, Qt::white);

13 loadModules();

14 splash->showMessage(QObject::tr("Establishing connections…"),

15 topRight, Qt::white);

16 establishConnections();

17 mainWin.show();

18 splash->finish(&mainWin);

19 delete splash;

20 return app.exec();

21 }

Рис. 3.18. Экранная заставка.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Π½Π° этом Π·Π°Π²Π΅Ρ€ΡˆΠΈΠΌ построСниС этого прилоТСния.

Π“Π»Π°Π²Π° 4. РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния

Π’ Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ способы создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ этого интСрфСйса. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ рассмотрим способы Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сохранСния Ρ„Π°ΠΉΠ»ΠΎΠ², хранСния Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° (clipboard) ΠΈ добавлСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ» элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊ классу QTableWidget.

Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚

Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ QMainWindow ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ любой Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. НиТС даСтся ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

1. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Qt

Π’ качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартныС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ QTableWidget ΠΈΠ»ΠΈ QTextEdit. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ сохранСниС Ρ„Π°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² подклассС QMainWindow).

2. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚

Π’ спСциализированных прилоТСниях часто трСбуСтся ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅. НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° рСдактирования ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor. Π’ Π³Π»Π°Π²Π΅ 5 Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ способы написания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Qt.

3. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QWidget с ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ

Иногда Π² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ области прилоТСния размСщаСтся ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ примСнСния QWidget Π² качСствС Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊΠΎ всСм Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ для задания Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ полоТСния.

4. Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ размСщСния Π² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ области Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ раздСлитСля QSplitter. QSplitter Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ свои Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈ прСдоставляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ возмоТности ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ.

5. Рабочая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ (workspace) интСрфСйса MDI

Если Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ интСрфСйс MDI, Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QWorkspace, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ интСрфСйса MDI Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ.

ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ области MDI ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно со стандартными Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Qt ΠΈΠ»ΠΈ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ. Π’ Π³Π»Π°Π²Π΅ 6 ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ эти классы.

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° примСняСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ подкласс класса QTableWidget. Класс QTableWidget ΡƒΠΆΠ΅ обСспСчиваСт Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½ΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΠ΄Π° Β«=Al+A2+A3Β» ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π°. ΠœΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ эти Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² классС Spreadsheet, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт QTableWidget.

БозданиС подкласса QTableWidget

Класс Spreadsheet наслСдуСт QTableWidget. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ QTableWidget фактичСски являСтся сСткой, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ собой Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ разряТСнный массив. На Π½Π΅ΠΌ отобраТаСтся Ρ‡Π°ΡΡ‚ΡŒ ячССк всСй сСтки, получСнная ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ изобраТСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ тСкста Π² ΠΏΡƒΡΡ‚ΡƒΡŽ ячСйку QTableWidget автоматичСски создаСт элСмСнт QTableWidgetItem для хранСния тСкста.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ сначала ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»:

01 #ifndef SPREADSHEET_H

02 #define SPREADSHEET_H

03 #include <QTableWidget>

04 class Cell;

05 class SpreadsheetCompare;

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» начинаСтся с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… объявлСний классов Cell ΠΈ SpreadsheetCompare.

Рис. 4.1. Π”Π΅Ρ€Π΅Π²ΡŒΡ наслСдования для классов Spreadsheet ΠΈ Cell.

Π’Π°ΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ячСйки QTableWidget, ΠΊΠ°ΠΊ Π΅Π΅ тСкст ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅, хранятся Π² QTableWidgetltem. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ QTableWidget, класс QTableWidgetltem Π½Π΅ являСтся Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ; это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ класс Π΄Π°Π½Π½Ρ‹Ρ…. Класс Cell наслСдуСт QTableWidgetltem, ΠΈ ΠΌΡ‹ рассмотрим этот класс Π² послСднСм Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ‹, Π³Π΄Π΅ прСдставим Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

06 class Spreadsheet : public QTableWidget

07 {

08 Q_OBJECT

09 public:

10 Spreadsheet(QWidget *parent = 0);

11 bool autoRecalculate() const { return autoRecalc; }

12 QString currentLocation() const;

13 QString currentFormula() const;

14 QTableWidgetSelectionRange selectedRange() const;

15 void clear();

16 bool readFile(const QString &fileName);

17 bool writeFile(const QString &fileName);

18 void sort(const SpreadsheetCompare &compare);

Ѐункция autoRecalculate() рСализуСтся ΠΊΠ°ΠΊ встроСнная (inline), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° лишь ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, задСйствован ΠΈΠ»ΠΈ Π½Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ автоматичСского пСрСрасчСта.

Π’ Π³Π»Π°Π²Π΅ 3 ΠΌΡ‹ ΠΎΠΏΠΈΡ€Π°Π»ΠΈΡΡŒ Π½Π° использованиС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Spreadsheet ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MainWindow НапримСр, ΠΈΠ· MainWindow::newFile() ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ clear() для очистки элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, унаслСдованныС ΠΎΡ‚ QTableWidget, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ setCurrentCell() ΠΈ setShowGrid().

19 public slots:

20 void cut();

21 void copy();

22 void paste();

23 void del();

24 void selectCurrentRow();

25 void selectCurrentColumn();

26 void recalculate();

27 void setAutoRecalculate(bool recalc);

28 void findNext(const QString &str, Qt::CaseSensitivity cs);

29 void findPrevious(const QString &str, Qt::CaseSensitivity cs);

30 signals:

31 void modified();

Класс Spreadsheet содСрТит ΠΌΠ½ΠΎΠ³ΠΎ слотов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ дСйствия ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню Edit, Tools ΠΈ Options, ΠΈ ΠΎΠ½ содСрТит ΠΎΠ΄ΠΈΠ½ сигал modified() для увСдомлСния ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ любого измСнСния.

32 private slots:

33 void somethingChanged();

ΠœΡ‹ опрСдСляСм ΠΎΠ΄ΠΈΠ½ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ слот, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса Spreadsheet.

34 private:

35 enum { MagicNumber = 0x7F51C883, RowCount = 999, ColumnCount = 26 };

36 Cell *cell(int row, int column) const;

37 QString text(int row, int column) const;

38 QString formula(int row, int column) const;

39 void setFormula(int row, int column, const QString &formula);

40 bool autoRecalc;

41 };

Π’ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ сСкции этого класса ΠΌΡ‹ объявляСм Ρ‚Ρ€ΠΈ константы, Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠ΄Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.

42 class SpreadsheetCompare

43 {

44 public:

45 bool operator()(const QStringList &row1, const QStringList &row2) const;

46 enum { KeyCount = 3 };

47 int keys[KeyCount];

48 bool ascending[KeyCount];

49 };

50 #endif

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» заканчиваСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ класса SpreadsheetCompare. ΠœΡ‹ объясним Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого класса ΠΏΡ€ΠΈ рассмотрСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Spreadsheet::sort().