Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Qt.doc
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

3.2. Добавление средств форматирования в текстовый редактор

3.2.1. Создание средств форматирования

Добавление новых команд меню:

– создайте меню Правка с пунктами Отменить, Повторить, далее поставьте разделитель и продолжите пунктами Вырезать, Копировать, Вставить, также добавьте снова через разделитель пункты Найти и Заменить;

– создайте меню Формат с пунктами Жирный, Курсив, Подчеркнутый и через разделитель Влево, По центру, Вправо, По ширине.

– создайте меню Справка с пунктом О себе – великом творце этой прекрасной программы.

Модификация действий:

  • дайте им осмысленные имена:

    1. для операций правки: action_Undo, action_Redo; action_Cut, action_Copy, action_Paste; action_Find, action_Replace;

    2. для операций форматирования: action_Bold, action_Italic, action_Underline; action_Left, action_Center, action_Right, action_Justify;

  • задайте им горячие клавиши:

    1. для операций правки: Ctrl+Z, Ctrl+Y; Ctrl+X, Ctrl+C, Ctrl+V; Ctrl+F, Ctrl+H;

    2. для операций форматирования: 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);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]