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

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

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

14 updateStatusBar();

15 }

Ѐункция QMainWindow::statusBar() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку состояния. (Π‘Ρ‚Ρ€ΠΎΠΊΠ° состояния создаСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ statusBar.) Π’ качСствС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² состояния просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ тСкстовыС ΠΌΠ΅Ρ‚ΠΊΠΈ QLabel, тСкст ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… измСняСтся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. ΠœΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ отступ для formulaLabel, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ здСсь тСкст отобраТался с нСбольшим смСщСниСм ΠΎΡ‚ Π»Π΅Π²ΠΎΠ³ΠΎ края. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ тСкстовых ΠΌΠ΅Ρ‚ΠΎΠΊ QLabel Π² строку состояния ΠΎΠ½ΠΈ автоматичСски становятся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ строкС состояния.

Рис. 3.8 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π΅ тСкстовыС ΠΌΠ΅Ρ‚ΠΊΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ пространство. Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ячСйки Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ мСста, ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство Π±ΡƒΠ΄Π΅Ρ‚ использовано для ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, Π³Π΄Π΅ отобраТаСтся Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° ячСйки. Π­Ρ‚ΠΎ достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ установки Ρ„Π°ΠΊΡ‚ΠΎΡ€Π° растяТСния Π½Π° 1 ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QStatusBar::addWidget() для Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ ячСйки ΠΏΡ€ΠΈ создании Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ€ растяТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ 0, ΠΈ поэтому ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒΡΡ.

Рис. 3.8. Π‘Ρ‚Ρ€ΠΎΠΊΠ° состояния прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Когда QStatusBar располагаСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠ½ постараСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Β«ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉΒ» Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QWidget::sizeHint(), ΠΈ Π·Π°Ρ‚Π΅ΠΌ растянСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ растяТСниС, заполняя Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство. Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° зависит ΠΎΡ‚ Π΅Π³ΠΎ содСрТания ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ сам ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ измСнСния содСрТания. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ постоянноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ячСйки, ΠΌΡ‹ устанавливаСм Π΅Π³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, достаточноС для размСщСния Π² Π½Π΅ΠΌ самого большого Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ тСкстового значСния (Β«W999Β»), ΠΈ добавляСм Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ пространства. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСм Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ выравнивания Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AlignHCenter для выравнивания ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ тСкста Π² области ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.

ΠŸΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ соСдиняСм Π΄Π²Π° сигнала Spreadsheet с двумя слотами Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° MainWindow: updateStatusBar() ΠΈ spreadsheetModified().

01 void MainWindow::updateStatusBar()

02 {

03 locationLabel->setText(spreadsheet->currentLocation());

04 formulaLabel->setText(spreadsheet->currentFormula());

05 }

Π‘Π»ΠΎΡ‚ updateStatusBar() обновляСт ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ располоТСния ячСйки ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ ячСйки. Он вызываСтся ΠΏΡ€ΠΈ любом ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ курсора ячСйки Π½Π° Π½ΠΎΠ²ΡƒΡŽ ячСйку. Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ createStatusBar() этот слот ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ обычная функция для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Spreadsheet ΠΏΡ€ΠΈ запускС Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал currentCellChanged().

06 void MainWindow::spreadsheetModified()

07 {

08 setWindowModified(true);

09 updateStatusBar();

10 }

Π‘Π»ΠΎΡ‚ spreadsheetModified() обновляСт всС Ρ‚Ρ€ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° для отраТСния ΠΈΠΌΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния прилоТСния ΠΈ устанавливаСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ modified Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. (ΠœΡ‹ использовали ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ modified ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ мСню File для контроля нСсохранСнных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.) Π‘Π»ΠΎΡ‚ spreadsheetModified() устанавливаСт свойство windowModified Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, обновляя строку Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. Π­Ρ‚Π° функция обновляСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ располоТСния ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ ячСйки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС.

РСализация мСню File

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ слоты ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для обСспСчСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ мСню File ΠΈ для управлСния списком Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

01 void MainWindow::newFile()

02 {

03 if (okToContinue ())

04 {

05 spreadsheet->clear();

06 setCurrentFile("");

07 }

08 }

Π‘Π»ΠΎΡ‚ newFile() вызываСтся ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню File | New ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ New Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов. Закрытая функция okToContinue() Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ вопрос ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСобходимости сохранСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Β«Do you want to save your changes?Β» β€” Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния?), Ссли измСнСния Π΄ΠΎ этого Π½Π΅ Π±Ρ‹Π»ΠΈ сохранСны. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Yes ΠΈΠ»ΠΈ No (сохраняя Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π΅ Yes), ΠΈ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Cancel. Ѐункция Spreadsheet::clear() ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ всС ячСйки ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Закрытая функция setCurrentFile() ΠΊΡ€ΠΎΠΌΠ΅ установки Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curFile ΠΈ обновлСния списка Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² измСняСт Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°, отраТая Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°.

01 bool MainWindow::okToContinue()

02 {

03 if (isWindowModified()) {

04 int r = QMessageBox::warning(this,

05 tr("Spreadsheet"), tr("The document has been modified.\n"

06 "Do you want to save your changes?"),

07 QMessageBox::Yes | QMessageBox::Default,

08 QMessageBox::No,

09 QMessageBox::Cancel | QMessageBox::Escape);

10 if (r == QMessageBox::Yes) {

11 return save();

12 } else if (r == QMessageBox::Cancel) {

13 return false;

14 }

15 }

16 return true;

17 }

B okToContinue() ΠΌΡ‹ провСряСм свойство windowModified. Если ΠΎΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, ΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран сообщСниС, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π° рис. 3.9. Окно сообщСния содСрТит ΠΊΠ½ΠΎΠΏΠΊΠΈ Yes, No ΠΈ Cancel. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ QMessageBox::Default Π΄Π΅Π»Π°Π΅Ρ‚ Yes ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ, которая выбираСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ QMessageBox::Escape Π·Π°Π΄Π°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Esc Π² качСствС синонима ΠΊΠ½ΠΎΠΏΠΊΠΈ Cancel.

Рис. 3.9. Β«Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния?Β»

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ warning() Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слишком слоТным, Π½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ простой Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

QMessageBox::warning(Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, сообщСниС, ΠΊΠ½ΠΎΠΏΠΊΠ°0, ΠΊΠ½ΠΎΠΏΠΊΠ°1, …);

QMessageBox содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ information(), question() ΠΈ critical(), каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Рис. 3.10. ΠŸΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠΊΠ½Π° сообщСния.

01 void MainWindow::open()

02 {

03 if (okToContinue()) {

04 QString fileName = QFileDialog::getOpenFileName(".", fileFilters, this);

05 if (!fileName.isEmpty())

06 loadFile(fileName);

07 }

08 }

Π‘Π»ΠΎΡ‚ open() соотвСтствуСт ΠΏΡƒΠ½ΠΊΡ‚Ρƒ мСню File | Open. Как ΠΈ слот newFile(), ΠΎΠ½ сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ okToContinue() для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ нСсохранСнных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QFileDialog::getOpenFileName() для получСния ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚Π° функция Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΡƒΡΡ‚ΡƒΡŽ строку ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ клавиши Cancel.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QFileDialog::getOpenFileName() задаСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. ВзаимодСйствиС Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ всСгда являСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ссли Ρƒ Π½Π΅Π³ΠΎ имССтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ, Ρ‚ΠΎ ΠΎΠ½ΠΎ размСщаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ панСль Π·Π°Π΄Π°Ρ‡ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ задаСтся Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ задаСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π°Ρ‡Π°Π»Π° просмотра Ρ„Π°ΠΉΠ»ΠΎΠ²; Π² нашСм случаС это Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³.

Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ опрСдСляСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ². Π€ΠΈΠ»ΡŒΡ‚Ρ€ Ρ„Π°ΠΉΠ»Π° состоит ΠΈΠ· ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ части ΠΈ ΠΎΠ±Ρ€Π°Π·Ρ†Π° поиска. Если Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ² прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ² с запятой Π² качСствС раздСлитСля ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² Lotus 1-2-3, Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

tr("Spreadsheet files (*.sp)\n"

"Comma-separated values files (*.csv)\n"

"Lotus 1-2-3 files (*.wk1 *.wks)")

Закрытая функция loadFile() Π²Ρ‹Π·Π²Π°Π½Π° Π² open() для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°. ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ нСзависимой, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ потрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ дСйствия для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈΡΡŒ Π½Π΅Π΄Π°Π²Π½ΠΎ:

01 bool MainWindow::loadFile(const QString &fileName)

02 {

03 if (!spreadsheet->readFile(fileName)) {

04 statusBar()->showMessage(tr("Loading canceled"), 2000);

05 return false;

06 }

07 setCurrentFile(fileName);

08 statusBar()->showMessage(tr("File loaded"), 2000);

09 return true;

10 }

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Spreadsheet::readFile() для чтСния Ρ„Π°ΠΉΠ»Π° с диска. Если Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setCurrentFile() для обновлСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π°; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция Spreadsheet::readFile() ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎ возникшСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, Π²Ρ‹Π΄Π°Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС. Π’ Ρ†Π΅Π»ΠΎΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π΄Π°Ρ‡Ρƒ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ… ошибки.