Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

01 class Editor : public QTextEdit

02 {

03 Q_OBJECT

04 public:

05 Editor(QWidget *parent = 0);

06 bool openFile(const QString &fileName);

07 bool save;

08 bool saveAs;

09 void newFile;

10 bool open;

11 protected:

12 QSize sizeHint const;

13 QAction *windowMenuAction const { return action; }

14 void closeEvent(QCloseEvent *event);

15 private slots:

16 void documentWasModified;

17 private:

18 bool okToContinue;

19 bool saveFile(const QString &fileName);

20 void setCurrentFile(const QString &fileName);

21 bool readFile(const QString &fileName);

22 bool writeFile(const QString &fileName);

23 QString strippedName(const QString &fullFileName);

24 QString curFile;

25 bool isUntitled;

26 QString fileFilters;

27 QAction *action;

28 }

Присутствующие в классе MainWindow приложения Электронная таблица четыре закрытые функции имеются также в классе Editor: okToContinue, saveFile, setCurrentFile и strippedName.

01 Editor::Editor(QWidget *parent)

02 : QTextEdit(parent)

03 {

04 action = new QAction(this);

05 action->setCheckable(true);

06 connect(action, SIGNAL(triggered), this, SLOT(show));

07 connect(action, SIGNAL(triggered), this, SLOT(setFocus));

08 isUntitled = true;

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, мы обрабатывам событие закрытия; в противном случае мы «игнорируем» его и окно оставляем прежним.

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

Семьи.net (сборник)

Панов Вадим Юрьевич
Фантастика:
социально-философская фантастика
научная фантастика
4.40
рейтинг книги
Семьи.net (сборник)

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Пересмешник

Пехов Алексей Юрьевич
Фантастика:
фэнтези
9.38
рейтинг книги
Пересмешник

Цветок камалейника

Громыко Ольга Николаевна
Фантастика:
фэнтези
9.17
рейтинг книги
Цветок камалейника

Тринадцатый III

NikL
3. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Тринадцатый III

Тринадцатый VII

NikL
7. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Тринадцатый VII

Князь Андер Арес 4

Грехов Тимофей
4. Андер Арес
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Князь Андер Арес 4

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Кодекс Охотника. Книга XXXVI

Винокуров Юрий
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7