25 bool isUntitled;
26 QString fileFilters;
27 QAction *action;
28 }
Присутствующие в классе
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 }
Сначала мы создаем действие
Поскольку мы разрешаем пользователям создавать любое количество окон редактора, мы должны предусмотреть соответствующую систему их наименования, чтобы они отличались до первого их сохранения. Один из распространенных методов решения этой проблемы заключается в назначении имен с числами (например,
Мы связываем сигнал текстового документа
Наконец, мы устанавливаем атрибут
После выпрлнения конструктора мы ожидаем вызова либо функции
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 }
Функция
Маркер «[*]» в заголовке окна указывает место, где мы хотим выдавать звездочку при несохраненных изменениях файла для платформ, отличных от 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 }
Функция
01 bool Editor::save()
02 {
03 if (isUntitled) {
04 return saveAs();
05 } else {
06 return saveFile(curFile);
07 }
Функция
01 void Editor::closeEvent(QCloseEvent *event)
02 {
03 if (okToContinue()) {
04 event->accept();
05 } else {
06 event->ignore();
07 }
08 }