- •Кросс-платформенное программирование
- •Введение
- •1. Основы работы с qt.
- •Теоретическое введение
- •Виджеты
- •3.1. Основы работы с Qt Designer
- •Контрольные вопросы
- •2. Создание графического интерфейса с помощью библиотеки классов qt
- •Теоретическое введение
- •Практическая часть
- •2.2. Создание динамически изменяемых окон
- •2.2.1 Создание формы
- •2.2.2. Подключение формы
- •2.2.3. Наполнение формы
- •2.2.4. Создание динамически изменяемых окон
- •2.3. Установка пиктограммы приложения
- •2.3.1. Установка пиктограммы приложения в Windows
- •Контрольные вопросы
- •3. Разработка текстового редактора в qt.
- •Теоретическое введение
- •1. Подключить библиотеку для работы с файлами:
- •2. Узнать имя файла, используя стандартный диалог (qFileDialog).
- •3. Создать объект файла (qFile).
- •4. Открыть файл (qFile).
- •5. Создать поток для ввода/вывода (qDataStream или qTextStream) и связать его с файлом.
- •6. Считать/записать данные с использованием потока (qDataStream или qTextStream).
- •7. Закрыть файл (qFile).
- •Практическая часть
- •3.1. Создание полноценного текстового редактора
- •3.1.1. Создание меню
- •3.1.2. Редактирование действий
- •3.2. Добавление средств форматирования в текстовый редактор
- •3.2.1. Создание средств форматирования
- •4.2.2. Работа с панелью инструментов
- •3.2.3. Наполнение действий по форматированию функциональностью
- •3.2.4. Самостоятельная работа
- •3.3. Дополнительные возможности
- •3.3.1. Цвет
- •3.3.2. Работа с принтером
- •3.3.3. Добавление стилей, шрифтов их размеров
- •3.3.4. Диалог поиска
- •Контрольные вопросы
- •4. Работа со стилями и создание переносимого мобильного приложения
- •Теоретическое введение
- •Практическая часть
- •4.1. Работа со стилями
- •Контрольные вопросы
- •5. Интернационализация программ в qt.
- •Теоретическое введение
- •Практическая часть
- •5.1. Русификация
- •5.2. Qt Linguist. Создание переводимого интерфейса приложения
- •5.3. Динамическое переключение языков.
- •Контрольные вопросы
- •6. Разработка медиаплеера на qt 5.2
- •Практическая часть
- •6.1. Разработка формы
- •6.2. Наполнение действий функционалом
- •7. Работа с 2d-графикой в qt
- •Практическая часть
- •8. Работа с базами данных в qt
- •Теоретическое введение
- •Практическая часть
- •8.1. Подготовка к подключению бд
- •8.2. Подключение с базе данных и выполнение sql-запросов
- •8.3. Реляционные бд в Qt
- •8.4. Сортировка и поиск по бд
- •Кросс-платформенное программирование
- •Св. План, 2014
- •61070, Харьков–70, ул. Чкалова, 17
- •61070, Харьков–70, ул. Чкалова, 17
3.2. Добавление средств форматирования в текстовый редактор
3.2.1. Создание средств форматирования
Добавление новых команд меню:
– создайте меню Правка с пунктами Отменить, Повторить, далее поставьте разделитель и продолжите пунктами Вырезать, Копировать, Вставить, также добавьте снова через разделитель пункты Найти и Заменить;
– создайте меню Формат с пунктами Жирный, Курсив, Подчеркнутый и через разделитель Влево, По центру, Вправо, По ширине.
– создайте меню Справка с пунктом О себе – великом творце этой прекрасной программы.
Модификация действий:
дайте им осмысленные имена:
для операций правки: action_Undo, action_Redo; action_Cut, action_Copy, action_Paste; action_Find, action_Replace;
для операций форматирования: action_Bold, action_Italic, action_Underline; action_Left, action_Center, action_Right, action_Justify;
задайте им горячие клавиши:
для операций правки: Ctrl+Z, Ctrl+Y; Ctrl+X, Ctrl+C, Ctrl+V; Ctrl+F, Ctrl+H;
для операций форматирования: Ctrl+B, Ctrl+I, Ctrl+U; Ctrl+L, Ctrl+E, Ctrl+R, Ctrl+J;
действиям из меню «Формат» задать свойство checkable либо поставить галочку – триггерное
установите для каждого из действий свою иконку: на сей раз возьмите недостающие из «<Путь установки Qt>\ <№ версии Qt>\ \mingw48_32\examples\widgets\richtext\textedit\images».
4.2.2. Работа с панелью инструментов
Когда вы попробуете добавить что-либо на панель инструментов у вас, скорее всего, возникнут некоторые сложности, т.к. контекстное меню не позволяет что-либо добавить кроме как объект под названием Разделитель.
Все достаточно просто: выделите желаемое действие (в редакторе действий) и перетащите его на панель инструментов – оно появиться на панели инструментов (см. рис. 3.14). Ничего более прописывать не надо к этим кнопкам автоматически подключаются уже созданные вами процедуры. Осталось лишь добавить разделители, расположив их так же, как и в меню.
Рис. 3.14. Добавление действий на панель инструментов
3.2.3. Наполнение действий по форматированию функциональностью
Начнем с самых простых: Отменить, Повторить, Вырезать, Копировать, Вставить. Если Вы были внимательны, то заметили, что «магические» комбинации клавиш связанные с этими операциями уже работают, не работают лишь кнопки – подключим их.
Следует повторить действия, которые вы осуществляли для подключения кнопки Выход: откройте вкладку редактор сигналов и слотов и, например, последовательно выберете: action_Cut, triggered(), textEdit, cut(). Нечто подобное совершите и для остальных действий. Вот так это все выглядело бы в программном коде:
connect(action_Undo, SIGNAL(triggered()), textEdit, SLOT(undo()));
connect(action_Redo, SIGNAL(triggered()), textEdit, SLOT(redo()));
connect(action_Cut, SIGNAL(triggered()), textEdit, SLOT(cut()));
connect(action_Copy, SIGNAL(triggered()), textEdit, SLOT(copy()));
connect(action_Paste, SIGNAL(triggered()), textEdit, SLOT(paste()));
Пожалуй, также следует проверять: должны ли эти кнопки быть доступны:
connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool)));
connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool)));
connect(textEdit, SIGNAL(undoAvailable(bool)), actionUndo, SLOT(setEnabled(bool)));
connect(textEdit, SIGNAL(redoAvailable(bool)), actionRedo, SLOT(setEnabled(bool)));
Теперь уберем галочку enable с действий Отменить, Повторить, Вырезать, Копировать, дабы они не были доступны нам изначально.
А для действия Вставить пропишите в конструкторе:
#ifndef QT_NO_CLIPBOARD
if (const QMimeData *md = QApplication::clipboard()->mimeData())
actionPaste->setEnabled(md->hasText());
#endif
Правда, чтобы этот код заработал, следует подключить:
#include <QClipboard>
#include <QMimeData>
Все. Первые пять инструментов мы подключили. Протестируйте приложение.
Теперь приступим к работе над пунктами Жирный, Курсив, Подчеркнутый. Создадим ряд своих процедур: выберем действие action_Bold, кликнем правой кнопкой мыши и выберем Перейти к слоту… Тоже самое повторите для остальных действий.
void MainWindow::on_action_Bold_triggered()
{
QTextCharFormat fmt;
fmt.setFontWeight(ui->action_Bold->isChecked() ? QFont::Bold : QFont::Normal);
mergeFormatOnWordOrSelection(fmt);
}
void MainWindow::on_action_Italic_triggered()
{
QTextCharFormat fmt;
fmt.setFontItalic(ui->action_Italic->isChecked());
mergeFormatOnWordOrSelection(fmt);
}
void MainWindow::on_action_Underline_triggered()
{
QTextCharFormat fmt;
fmt.setFontUnderline(ui->action_Underline->isChecked());
mergeFormatOnWordOrSelection(fmt);
}
Как видно, стоит дописать еще одну процедуру:
void MainWindow::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
QTextCursor cursor = ui->textEdit->textCursor();
if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor);
cursor.mergeCharFormat(format);
ui->textEdit->mergeCurrentCharFormat(format);
}
И я думаю, Вы же не забудете описать ее в классе и подключить необходимые модули:
#include <QTextCharFormat>
void mergeFormatOnWordOrSelection(const QTextCharFormat &format);
Это интересно. Попробуйте также вставить в процедуру подчеркивания строчку: fmt.setFontOverline(ui->action_Underline->isChecked());
Запустите. Форматирование будет работать, правда, не совсем правильно.
Рис. 3.15. Добавление действиям свойства триггерности
Теперь займемся пунктами Влево, По центру, Вправо, По ширине – повторите действия описанные выше, но уже для этих пунктов.
void MainWindow::on_action_Left_triggered()
{
ui->textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute);
}
void MainWindow::on_action_Center_triggered()
{
ui->textEdit->setAlignment(Qt::AlignHCenter);
}
void MainWindow::on_action_Right_triggered()
{
ui->textEdit->setAlignment(Qt::AlignRight | Qt::AlignAbsolute);
}
void MainWindow::on_action_Justify_triggered()
{
ui->textEdit->setAlignment(Qt::AlignJustify);
}
Им, как и предыдущим действиям, также следует задать свойство – триггерное, а также дописать процедуру, которая проверяет и устанавливает это свойство в зависимости от выбранного выравнивания:
void MainWindow::alignmentChanged(Qt::Alignment a)
{
if (a & Qt::AlignLeft) {
ui->action_Left->setChecked(true);
ui->action_Center->setChecked(false);
ui->action_Right->setChecked(false);
ui->action_Justify->setChecked(false);
} else if (a & Qt::AlignHCenter) {
ui->action_Left->setChecked(false);
ui->action_Center->setChecked(true);
ui->action_Right->setChecked(false);
ui->action_Justify->setChecked(false);
} else if (a & Qt::AlignRight) {
ui->action_Left->setChecked(false);
ui->action_Center->setChecked(false);
ui->action_Right->setChecked(true);
ui->action_Justify->setChecked(false);
} else if (a & Qt::AlignJustify) {
ui->action_Left->setChecked(false);
ui->action_Center->setChecked(false);
ui->action_Right->setChecked(false);
ui->action_Justify->setChecked(true);
}
}
Ее следует вызвать в конструкторе:
alignmentChanged(ui->textEdit->alignment());
а также не забыть прописать в классе:
void alignmentChanged(Qt::Alignment a);
еще допишем ее во все 4 действия для работы с выравниванием, к примеру:
void MainWindow::on_action_Left_triggered()
{
ui->textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute);
alignmentChanged(ui->textEdit->alignment());
}
Как вы, должно быть, догадываетесь это еще не все. =)
Следить за состоянием триггерных действий мы должны динамически в зависимости от позиции курсора и текста под ним:
void MainWindow::currentCharFormatChanged(const QTextCharFormat &format)
{
fontChanged(format.font());
// colorChanged(format.foreground().color());
}
void MainWindow::cursorPositionChanged()
{
alignmentChanged(ui->textEdit->alignment());
}
void MainWindow::fontChanged(const QFont &f)
{
ui->action_Bold->setChecked(f.bold());
ui->action_Italic->setChecked(f.italic());
ui->action_Underline->setChecked(f.underline());
}
В конструкторе необходимо дописать:
connect(ui->textEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(currentCharFormatChanged(QTextCharFormat)));
connect(ui->textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged()));
Также сделаем вызовы в конструкторе для шрифта и цвета:
fontChanged(ui->textEdit->font());
// colorChanged(ui->textEdit->textColor());
Естественно процедуры необходимо описать в классе (в секции private):
void cursorPositionChanged();
void fontChanged(const QFont &f);
(в секции private slots):
void currentCharFormatChanged(const QTextCharFormat &format);
