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

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

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

Ѐункция qobject_cast<T>() выполняСт динамичСскоС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° основС мСта―информации, сгСнСрированной moc β€” компилятором ΠΌΠ΅Ρ‚Π°β€”ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Qt. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΉ подкласс QObject ΠΈΠ»ΠΈ 0, Ссли нСльзя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ привСсти ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dynamic_cast<T>() стандартного Π‘++, функция Qt qobject_cast<T>() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ qobject_cast<T>() для привСдСния указатСля QObject Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ QAction. Если ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡƒΠ΄Π°Ρ‡Π½ΠΎ (Π° ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ), ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ loadFile(), задавая ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· элСмСнта Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚Π° мСню.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ слот вызывался ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ QAction, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всС ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сработала Π±Ρ‹ ΠΏΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ static_cast<T>() ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π‘β€”Ρ‚ΠΈΠΏΠΎΠ². (Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» Β«ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²Β» Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘, Π³Π΄Π΅ даСтся ΠΎΠ±Π·ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² привСдСния Ρ‚ΠΈΠΏΠΎΠ² Π² Π‘++.)

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим способы примСнСния Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ Π² Qt: ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌΠΈ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° Find, Go-to-Cell ΠΈ Sort (Π½Π°ΠΉΡ‚ΠΈ, ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ячСйку ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ созданы Π½Π°ΠΌΠΈ Π² Π³Π»Π°Π²Π΅ 2. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ создадим простоС ΠΎΠΊΠ½ΠΎ About (справка ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅).

Рис. 3.12. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°.

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Find. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠΌΠ΅Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ свободно ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, это Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ. ΠΠ΅ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ называСтся ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСзависимо ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΊΠΎΠ½ прилоТСния.

ΠŸΡ€ΠΈ создании Π½Π΅ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ свои сигналы, соСдинСнныС со слотами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

01 void MainWindow::find()

02 {

03 if (!findDialog) {

04 findDialog = new FindDialog(this);

05 connect(findDialog, SIGNAL (findNext(const QString &,

06 Qt::CaseSensitivity)),

07 spreadsheet, SLOT (findNext(const QString &,

08 Qt::CaseSensitivity)));

09 connect(findDialog, SIGNAL(findPrevious(const QString &,

10 Qt::CaseSensitivity)),

11 spreadsheet, SLOT(findPrevious(const QString &,

12 Qt::CaseSensitivity)));

13 }

14 findDialog->show();

15 findDialog->activateWindow();

16 }

Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск тСкста Π² элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Π‘Π»ΠΎΡ‚ find() вызываСтся ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню Edit | Find (ΠŸΡ€Π°Π²ΠΊΠ° | Найти) для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Find. ПослС этого Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ‚Ρ€ΠΈ сцСнария развития событий Π² зависимости ΠΎΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условий:

β€’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find вызываСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·;

β€’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find ΡƒΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎΡΡŒ, Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΅Π³ΠΎ Π·Π°ΠΊΡ€Ρ‹Π»;

β€’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find ΡƒΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎΡΡŒ, ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²ΠΈΠ΄ΠΈΠΌΠΎ.

Если Π½Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Find, ΠΌΡ‹ создаСм Π΅Π³ΠΎ, Π° Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ findNext() ΠΈ findPrevious() подсоСдиняСм ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ слотам элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Spreadsheet. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ это Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π² конструкторС MainWindow, Π½ΠΎ отсрочка Π΅Π³ΠΎ создания ускоряСт запуск прилоТСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли это Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ использовано, Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ сэкономит врСмя ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ show() ΠΈ activateWindow() ΠΈ Ρ‚Π΅ΠΌ самым Π΄Π΅Π»Π°Π΅ΠΌ это ΠΎΠΊΠ½ΠΎ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ скрытоС ΠΎΠΊΠ½ΠΎ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, достаточно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ show(), Π½ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Find ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΡƒΠΆΠ΅ имССтся Π½Π° экранС, ΠΈ Π² этом случаС функция show() Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ activateWindow(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ. МоТно ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

if (findDialog->isHidden()) {

findDialog->show();

} else {

findDialog->activateWindow();

}

Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ситуации, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ смотритС Π² ΠΎΠ±Π΅ стороны ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΡƒΠ»ΠΈΡ†Ρ‹ с односторонним Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ созданию Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Go-to-Cell (ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ячСйку). ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ Π΅Π³ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ, произвСсти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ячСйку Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ. Окно называСтся ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ, Ссли послС Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ€Π°Π±ΠΎΡ‚Π° прилоТСния блокируСтся ΠΈ оказываСтся Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ прилоТСния Π΄ΠΎ закрытия этого ΠΎΠΊΠ½Π°. ВсС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π½Π°ΠΌΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° ΠΈ ΠΎΠΊΠ½Π° с сообщСниями Π±Ρ‹Π»ΠΈ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Рис. 3.13. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Go-to-Cell прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ, Ссли ΠΎΠ½ΠΎ вызываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ show() (Ссли ΠΌΡ‹ Π½Π΅ сдСлали Π΄ΠΎ этого Π΅Π³ΠΎ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ, воспользовавшись Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ setModal()); ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ, Ссли вызываСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec().

01 void MainWindow::goToCell()

02 {

03 GoToCellDialog dialog(this);

04 if (dialog.exec()) {

05 QString str = dialog.lineEdit->text().toUpper();

06 spreadsheet->setCurrentCell(str.mid(1).toInt() - 1,

07 str[0].unicode() - 'А');

08 }

09 }

Ѐункция QDialog::exec() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true (QDialog::Accepted), Ссли Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ подтвСрТдаСтся дСйствиС, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false (QDialog::Rejected) Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Напомним, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π² Π³Π»Π°Π²Π΅ 2 создали Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ячСйку ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Qt Designer ΠΈ подсоСдинили ΠΊΠ½ΠΎΠΏΠΊΡƒ OK ΠΊ слоту accept(), Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Cancel β€” ΠΊ слоту reject(). Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK, ΠΌΡ‹ устанавливаСм Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ячСйку Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π² строкС рСдактирования.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QTableWidget::setCurrentCell() Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: индСкс строки ΠΈ индСкс столбца. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ A1 относится ΠΊ ячСйкС (0, 0), Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ B27 относится ΠΊ ячСйкС (26, 1). Для получСния индСкса строки ΠΈΠ· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QLineEdit::text() значСния Ρ‚ΠΈΠΏΠ° QString ΠΌΡ‹ выдСляСм Π½ΠΎΠΌΠ΅Ρ€ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QString::mid() (которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ подстроку с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° этой строки), ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π΅ Π² Ρ†Π΅Π»ΠΎΠ΅ число Ρ‚ΠΈΠΏΠ° int ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QString::toInt() ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Для получСния Π½ΠΎΠΌΠ΅Ρ€Π° столбца ΠΌΡ‹ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ числовой ΠΊΠΎΠ΄ Π±ΡƒΠΊΠ²Ρ‹ «А» ΠΈΠ· числового ΠΊΠΎΠ΄Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ строки, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² ΠΏΡ€ΠΎΠΏΠΈΡΠ½ΡƒΡŽ. ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ строка Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ осущСствляСмый Π½Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ QRegExpValidator Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π·Π° Π±ΡƒΠΊΠ²ΠΎΠΉ располагаСтся Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Ρ… Ρ†ΠΈΡ„Ρ€.

Ѐункция goToCell() отличаСтся ΠΎΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° создаСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ (GoToCellDialog) Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ стСка. ΠœΡ‹ ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ new ΠΈ delete, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄Π½Ρƒ строку:

01 void MainWindow::goToCell()

02 {

03 GoToCellDialog *dialog = new GoToCellDialog(this);

04 if (dialog->exec()) {

05 QString str = dialog->lineEdit->text().toUpper();

06 spreadsheet->setCurrentCell(str.mid(1).toInt() - 1,

07 str[0].unicode() - 'A');

08 }

09 delete dialog;

10 }

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ (ΠΈ контСкстных мСню ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ QWidget::contextMenuEvent()) являСтся ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ программирования, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ (ΠΈΠ»ΠΈ мСню) Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ послС Π΅Π³ΠΎ использования, ΠΈ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· области видимости.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ созданию Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Sort. Π­Ρ‚ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ являСтся ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, задавая Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ сортировки ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ столбцы. На рис. 3.14 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сортировки, ΠΊΠΎΠ³Π΄Π° Π² качСствС Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° сортировки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ столбСц Π’, Π° Π² качСствС Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° сортировки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ столбСц А (Π² ΠΎΠ±ΠΎΠΈΡ… случаях сортировка выполняСтся ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ).

Рис. 3.14. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

01 void MainWindow::sort()

02 {

03 SortDialog dialog(this);

04 QTableWidgetSelectionRange range = spreadsheet->selectedRange();

05 dialog.setColumnRange('A' + range.leftColumn(),

06 'А' + range.rightColumn());