Π ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ΄Π°Π²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΡΡΡΠΎΠΊΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ 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(), Π·Π°Π΄Π°Π²Π°Ρ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΠ½ΠΊΡΠ° ΠΌΠ΅Π½Ρ.