Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

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 }

Функция setCurrentFile вызывается из openFile и saveFile для обновления переменных curFile и isUntitled, установки текста заголовка окна и пункта меню, а также для установки значения флажка модификации документа на false. Всякий раз, когда пользователь изменяет текст в редакторе, объект базового класса QTextDocument генерирует сигнал contentsChanged и устанавливает свой внутренний флажок модификации на значение true.

01 QSize Editor::sizeHint const

02 {

03 return QSize(72 * fontMetrics.width('x'),

04 25 * fontMetrics.lineSpacing);

05 }

Функция sizeHint возвращает размер, рассчитанный на основе ширины буквы «x» и высоты строки текста. QWorkspace использует идеальный размер в качестве начального размера окна.

Ниже приводится файл main.cpp MDI—приложения Editor:

  • Читать дальше
  • 1
  • ...
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: