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

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

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

Π’ ΠΎΠ±ΠΎΠΈΡ… случаях ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ сообщСниС Π² строкС состояния Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 2 сСкунд (2000 миллисСкунд) для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π½Π°Π» ΠΎ выполняСмых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ дСйствиях.

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() для сохранСния Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… настроСк прилоТСния.

Когда закрываСтся послСднСС ΠΎΠΊΠ½ΠΎ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠŸΡ€ΠΈ нСобходимости ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹, устанавливая свойство quitOnLastWindowClosed класса QApplication Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QApplication::quit().

01 void MainWindow::setCurrentFile(const QString &fileName)

02 {

03 curFile = fileName;

04 setWindowModified(false);

05 QString shownName = "Untitled";

06 if (!curFile.isEmpty()) {

07 shownName = strippedName(curFile);

08 recentFiles.removeAll(curFile);

09 recentFiles.prepend(curFile);

10 updateRecentFileActions();

11 }

12 setWindowTitle(tr("%1[*] - %2").arg(shownName)

13 .arg(tr("Spreadsheet")));

14 }


15 QString MainWindow::strippedName(const QString &fullFileName)

16 {

17 return QFileInfo(fullFileName).fileName();

18 }

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setCurrentFile() ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curFile, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТится имя Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅, ΠΌΡ‹ ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strippedName(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ имя Ρ„Π°ΠΉΠ»Π° выглядСло Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ QWidget ΠΈΠΌΠ΅Π΅Ρ‚ свойство windowModified, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ установлСно Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠΊΠ½Π° содСрТит нСсохранСнныС измСнСния, ΠΈ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π’ систСмС Mac OS X нСсохранСнныС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ закрытия, располоТСнной Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΎΠΊΠ½Π°, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах Ρ‚Π°ΠΊΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. ВсС это обСспСчиваСтся Π² Qt автоматичСски, Ссли ΠΌΡ‹ своСврСмСнно обновляСм свойство windowModified ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ Β«[*]Β» Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setWindowTitle() ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст:

tr("%1[*] - %2").arg(shownName)

.arg(tr("Spreadsheet"))

Ѐункция QString::arg() замСняСт своим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Β«%nΒ» с наимСньшим Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ строку. Π’ нашСм случаС arg() ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Β«%nΒ». ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ функция arg() замСняСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Β«%1Β»; Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² замСняСт Β«%2Β». Если Ρ„Π°ΠΉΠ» ΠΈΠΌΠ΅Π΅Ρ‚ имя Β«budget.spΒ» ΠΈ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ строку Β«budget.sp[*] β€” SpreadsheetΒ». ΠŸΡ€ΠΎΡ‰Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

setWindowTitle(shownName + tr("[*] - Spreadsheet"));

Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ arg() ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ сообщСния Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки.

Если Π·Π°Π΄Π°Π½ΠΎ имя Ρ„Π°ΠΉΠ»Π°, ΠΌΡ‹ обновляСм recentFiles β€” список ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈΡΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅Π΄Π°Π²Π½ΠΎ. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ removeAll() для удалСния всСх Ρ„Π°ΠΉΠ»ΠΎΠ² с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ· списка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования; Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ prepend() для помСщСния ΠΈΠΌΠ΅Π½ΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Π½Π°Ρ‡Π°Π»ΠΎ списка. ПослС обновлСния списка ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ updateRecentFileActions() для обновлСния ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню File.

01 void MainWindow::updateRecentFileActions()

02 {

03 QMutableStringListIterator i(recentFiles);

04 while (i.hasNext()) {

05 if (!QFile::exists(i.next()))

06 i.remove();

07 }

08 for (int j = 0; j < MaxRecentFiles; ++j) {

09 if (j < recentFiles.count()) {

10 QString text = tr("&%1 %2")

11 .arg(j + 1)

12 .arg(strippedName(recent Files[j]));

13 recentFileActions[j]->setText(text);

14 recentFileActions[j]->setData(recentFiles[j]);

15 recentFileActions[j]->setVisible(true);

16 } else {

17 recentFileActions[j]->setVisible(false);

18 }

19 }

20 separatorAction->setVisible(!recentFiles.isEmpty());

21 }

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ удаляСм всС Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π² стилС Java. НСкоторыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ сСансС, Π½ΠΎ с этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΡ… ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ recentFiles ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QStringList (список QStrings). Π’ Π³Π»Π°Π²Π΅ 11 ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ классы—контСйнСры, ΠΊΠ°ΠΊ QStringList, ΠΈ ΠΈΡ… связь со стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ шаблонов Π‘++ (Standard Template Library β€” STL), a Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Qt классов ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² стилС Java.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ снова ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ списку Ρ„Π°ΠΉΠ»Π°, Π½Π° этот Ρ€Π°Π· ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ индСксациСй массива. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΌΡ‹ создаСм строку ΠΈΠ· ампСрсанда, Π½ΠΎΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° (j + 1), ΠΏΡ€ΠΎΠ±Π΅Π»Π° ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° (Π±Π΅Π· ΠΏΡƒΡ‚ΠΈ). Для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ этот тСкст. НапримСр, Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π±Ρ‹Π» Ρ„Π°ΠΉΠ» Π‘:\My Documents\tab04.sp, ΠΏΡƒΠ½ΠΊΡ‚ мСню ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ тСкст Β«&1 tab04.spΒ».

Рис. 3.11. МСню File со списком Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈΡΡŒ Π½Π΅Π΄Π°Π²Π½ΠΎ.

Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠΌ мСню recentFileActions ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… Β«dataΒ» Ρ‚ΠΈΠΏΠ° QVariant. Π’ΠΈΠΏ QVariant ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π‘++ ΠΈ Qt; ΠΎΠ½ рассматриваСтся Π² Π³Π». 11. Π—Π΄Π΅ΡΡŒ Π² элСмСнтС мСню Β«dataΒ» ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π»Π΅Π³ΠΊΠΎ Π΅Π³ΠΎ Π½Π°ΠΉΡ‚ΠΈ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π°Π΅ΠΌ этот ΠΏΡƒΠ½ΠΊΡ‚ мСню Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ.

Если ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню (массив recentFileActions) большС, Ρ‡Π΅ΠΌ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (массив recentFiles), ΠΌΡ‹ просто Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹. НаконСц, Ссли сущСствуСт ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ.

01 void MainWindow::openRecentFile()

02 {

03 if (okToContinue()) {

04 QAction *action = qobject_cast<QAction *>(sender());

05 if (action)

06 loadFile(action->data(). toString());

07 }

08 }

ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° вызываСтся слот openRecentFile(). Ѐункция okToContinue() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ нСсохранСнныС измСнСния, ΠΈ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΠ» сохранСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΌΡ‹ опрСдСляСм, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ мСню Π²Ρ‹Π·Π²Π°Π» слот, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QObject::sender().

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