Читаем QT 4: программирование GUI на С++ полностью

09 fileFilters = tr("Text files (*.txt)\nAll files (*)");

10 connect(document, SIGNAL(contentsChanged),

11 this, SLOT(documentWasModified));

12 setWindowIcon(QPixmap(":/images/document.png"));

13 setAttribute(Qt::WA_DeleteOnClose);

14 }

Сначала мы создаем действие QAction, представляющее редактор в меню приложения Window, и связываем его со слотами show и setFocus.

Поскольку мы разрешаем пользователям создавать любое количество окон редактора, мы должны предусмотреть соответствующую систему их наименования, чтобы они отличались до первого их сохранения. Один из распространенных методов решения этой проблемы заключается в назначении имен с числами (например, document1.txt). Мы используем переменную isUntitled, чтобы отличить предоставляемые пользователем имена документов и сгенерированные программно.

Мы связываем сигнал текстового документа contentsChanged c закрытым слотом documentWasModified. Этот слот просто вызывает setWindowModified(true).

Наконец, мы устанавливаем атрибут Qt::WA_DeleteOnClose для предотвращения утечек памяти при закрытии пользователем окна Editor.

После выпрлнения конструктора мы ожидаем вызова либо функции newFile, либо функции open.

01 void Editor::newFile

02 {

03 static int documentNumber = 1;

04 curFile = tr("document%1.txt").arg(documentNumber);

05 setWindowTitle(curFile + "[*]");

06 action->setText(curFile);

07 isUntitled = true;

08 ++documentNumber;

09 }

Функция newFile генерирует для нового документа имя типа document1.txt. Этот программный код помещен в функцию newFile, a не в конструктор, поскольку мы не хотим использовать числа при вызове функции open для открытия существующего документа во вновь созданном редакторе Editor. Поскольку переменная documentNumber объявлена как статическая, она совместно используется всеми экземплярами Editor.

Маркер «[*]» в заголовке окна указывает место, где мы хотим выдавать звездочку при несохраненных изменениях файла для платформ, отличных от Mac OS X. Мы рассматривали этот маркер в главе 3.

01 bool Editor::open

02 {

03 QString fileName = QFileDialog::getOpenFileName(

04 this, tr("Open"), fileFilters);

05 if(fileName.isEmpty)

06 return false;

07 return openFile(fileName);

08 }

Функция open пытается открыть сущеcтвующий файл при помощи функции openFile.

01 bool Editor::save

02 {

03 if (isUntitled) {

04 return saveAs;

05 } else {

06 return saveFile(curFile);

07 }

Функция save используёт переменную isUntitled для определения вида вызываемой функции saveFile или saveAs.

01 void Editor::closeEvent(QCloseEvent *event)

02 {

03 if (okToContinue) {

04 event->accept;

05 } else {

06 event->ignore;

07 }

08 }

Функция closeEvent переопределяется, чтобы разрешить пользователю сохранить несохраненные изменения. Вся логика содержится в функции okToContinue, которая выводит сообщение «Do you want to save your changes?» (Сохранить изменения?). Если функция okToContinue возвращает true, мы обрабатывам событие закрытия; в противном случае мы «игнорируем» его и окно оставляем прежним.

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

02 {

03 curFile = fileName;

04 isUntitled = false;

05 action->setText(strippedName(curFile));

06 document->setModified(false);

07 setWindowTitle(strippedName(curFile) + "[*]");

08 setWindowModified(false);

09 }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже