1. Если вы внимательно посмотрите вниз экрана, то обнаружите, что там появились так называемые Действия (Action) – реакции на нажатие соответствующих пунктов меню.
2. Давайте модифицируем их, заменив названия на более осмысленные, например, action_New, action_Open, action_Save, action_Save_as и action_Quit, а также добавим к ним горячие комбинации клавиш. Делается это просто: в окне редактирования действия (чтоб попасть в него дважды щелкните на самом действии) нажмите: Ctrl+N, Ctrl+O, Ctrl+S, Ctrl+Q для соответствующих действий.
Это важно: вводите наименования действий внимательно, например, не стоит случайно ставить в нем пробел в конце (это не так просто заметить).
Рис. 3.6. Окно редактирования действия
3. Для того чтобы сделать меню более привлекательным добавим к каждому действию свою иконку, а чтоб иконкам было где жить, создадим файл ресурсов.
Рис. 3.7. Добавление нового файла в проект
Рис. 3.8. Создание файла ресурсов
Нас попросят ввести его имя (рекомендую использовать имя проекта, в данном случае QReader, но это остается на вашем усмотрении), а также размещение ресурсного файла (в принципе его можно разместить где угодно, но опять же лучше расположить его в директории проекта, что услужливо рекомендует программа). Нажмите Далее и Завершить.
Теперь дважды щелкните на QReader.qrc (если вы так назвали файл) на боковой панели. Теперь нажмите на кнопку Добавить и выберите Добавить префикс. Можете поменять название префикса на более осмысленное.
Рис. 3.9. Добавление префиксов и файлов в ресурсный файл
Сейчас нам следует найти (или самим создать) файлы, которые мы будем использовать в качестве иконок. Размеры иконок должны быть 32х32. Рекомендую взять файлы из «<Путь установки Qt>\<№ версии Qt>\ \mingw48_32\examples\widgets\mainwindows\application\images», либо из «\\K105\labpract\Qt\Pictures\images». Добавьте их в ресурсный файл.
Советую переместить файлы изображений в каталог с программой и поместить их, например, в созданную вами папку «images».
Снова вернемся в окно редактирования формы и зададим иконки для всех действий. Сделать это можно через Окно редактирования действия (рис. 3.6), либо через окно редактирования свойств (рис. 3.10). Таким образом, задайте иконки для всех пунктов меню.
Рис. 3.10. Окно редактирования свойств действия
Рис. 3.11. Выбор иконок для пунктов меню
3. Рядом с редактором действий есть редактор сигналов и слотов перейдем в него и последовательно выберем: action_Quit, triggered(), MainWindow, close(). Теперь по нажатию на пункт меню Выход главное окно приложения закроется.
4. Добавим на главное окно элемент Text Edit (он находиться в разделе Input Widgets). Назовем его «textEdit».
Дабы окошко с текстом масштабировалось вместе с приложением, необходимо настроить его компоновку.
5. Начнем работать с файлами. Создадим свою процедуру для открытия файла: выберите действие action_Open, кликните правой кнопкой мыши и выберите Перейти к слоту…
Рис. 3.12. Привязка сигналов и слотов
В открывшемся диалоговом окне выберите сигнал triggered() и нажмите ОК. Вы попадете в окно редактирования программного кода, здесь стоит написать то, что произойдет при выборе пункта меню Открыть.
6. Займемся написанием программного кода.
Добавим в эту функцию следующий код:
void MainWindow::on_action_Open_triggered(){ QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) loadFile(fileName);}
Нам приходиться дописать еще пару своих функций – первая устанавливает имя файла, с которого идет чтение, вторая собственно и читает из файла:
Следует не забыть добавить описание заголовков этих методов в класс (файл mainwindow.h):
private:
void loadFile(const QString &fileName);
void setCurrentFileName(const QString &fileName);
и одного атрибута:
private:
QString fileName;
да и не забыть подключить заголовочные файлы:
#include <QFileDialog>
#include <QTextCodec>
#include <QMessageBox>
#include <QTextStream>
а еще вызвать одну из процедур в конструкторе нашего главного класса:
setCurrentFileName(QString());
Все! На данном этапе у нас готов простенький просмотрщик текстовых файлов. Проверьте работоспособность приложения.
7. Для того чтоб наш просмотрщик стал простеньким текстовым редактором следует добавить возможность сохранения файла. Для этого повторите пункт 5, но только для действий action_Save и action_Save_as.
8. Дописываемый код будет выглядеть следующим образом:
Нам необходимо добавить еще один заголовочный файл:
#include <QTextDocumentWriter>
а еще изменить процедуру открытия файла:
void MainWindow::on_action_Open_triggered(){ if (maybeSave()) { QString fileName = QFileDialog::getOpenFileName(this);// Здесь стоит написать Ваши собственные поля метода!!! if (!fileName.isEmpty()) loadFile(fileName); }}
Как видим, здесь нам следует проверить стоит ли сохранять файл:
bool MainWindow::maybeSave(){ if (!ui->textEdit->document()->isModified()) return true; if (fileName.startsWith(QLatin1String(":/"))) return true; QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) { on_action_Save_triggered(); return true; } else if (ret == QMessageBox::Cancel) return false; return true;}
Не забудьте дописать в заголовочный файл в секцию private:
bool maybeSave();
9. Давайте еще добавим простенькую функцию создания нового файла. Для этого повторите пункт 5, но только для действия action_New.
10. Дописываемый код будет выглядеть следующим образом:
void MainWindow::on_action_New_triggered()
{
if (maybeSave())
{
ui->textEdit->clear();
setCurrentFileName(QString());
}
}
11. Укажем программе, кто здесь главный! Напишите в конструкторе:
setCentralWidget(ui->textEdit);
ui->textEdit->setFocus();
Рис. 3.13. Результат – простой текстовый редактор без поддержки форматирования
На данном этапе мы можем открывать обычные текстовые файлы, их редактировать и сохранять.
На последок, чтоб украсить – подключите к Вашему ПО иконку, как для главного окна, так и для исполняемого файла (см. подраздел 2.3).