Новость из категории: Информация

Программирование проверки правописания: проверка в Qt

Содержание:
1. Проверка в GTK+;
2. Проверка в Qt (Вы читаете данный раздел).
Программирование проверки правописания: проверка в Qt

А как то же самое сделать в Qt? Предположим, у нас есть виджет, в котором отображается обычный текст, без форматированного шрифта. Это может быть виджет QPlainTextEdit либо QTextEdit с выключенным режимом RichText. Для пометки ошибочных слов будем просто подчеркивать их красным цветом. Где-то мы объявим экземпляр виджета:
QPlainTextEdit textEdit;

Еще нам понадобится служебная функция, которая просто сделает дальнейший код более удобочитаемым:
bool char _ is _ crap (const QChar Sc) {
if (! c.isNull() SS ! c.isLetter()) return true;
return false;
}
Она возвращает истину, если переданный символ не пуст, но и не является буквой. Код проверки правописания будет таков:
// служебный счетчик, понадобится для отсчета слов int i = 0;
// получаем курсор
QTextCursor cr = textEdit->textCursor(); int pos = cr.position();
// получаем весь текст из виджета QString text = textEdit->toPlainText();
// удалим все подчеркивания cr.setPosition (0);
cr.movePosition (QTextCursor::End, QTextCursor::KeepAnchor); QTextCharFormat f = cr.blockCharFormat(); f.setFontUnderline (false); cr.mergeCharFormat (f);
// и переместим курсор снова в начало cr.setPosition (0);
cr.movePosition (QTextCursor:: Start, QTextCursor: :MoveAnchor);
// цикл проверки правописания
do
{
// на каждом сотом слове даем движку Qt
// возможность обработать события обновления интерфейса:
if (i % 100 == 0)
qApp->processEvents();
// получаем символ по месту курсора: QChar c = text.at (cr.position());
// по идее, мы в начале слова, но так ли это? // если символ не пуст, однако и не буква,
// то в цикле перебираем буквы дальше if (char _ is _ crap (c)) while (char _ is _ crap (c)) {
cr.movePosition (QTextCursor::NextCharacter); c = text.at (cr.position());
}
// вот тут мы нашли начало слова
// выделяем его до конца:
cr.movePosition (QTextCursor::EndOfWord,
QTextCursor: :KeepAnchor); c = text.at (cr.position());
// получаем текст из выделения: QString stext = cr.selectedText();
// если этот текст не пуст и завершается
// кавычкой, уменьшаем выделение на 1 символ
// влево:
if (! stext.isNull() SS stext.endsWith (""")) {
cr.movePosition (QTextCursor::PreviousCharacter,
QTextCursor: :KeepAnchor); stext = cr.selectedText();
}
// собственно проверка правописания
// для выделенного слова:
if (! stext.isNull() || ! stext.isEmpty())
if (! ПРОВЕРИТЬ_ПРАВОПИСАНИЕ (cr.selectedText()))
{
// получим шрифтовое форматирование выделения:
f = cr.blockCharFormat();
// назначим стиль подчеркивания
f.setUnderlineStyle (QTextCharFormat::WaveUnderline);
// красным цветом
f.setUnderlineColor (QColor ("red"));
// и установим подчеркивание f.setFontUnderline (true); cr.mergeCharFormat (f);
}
// увеличим счетчик
}
// сдвигаем курсор к следующему слову
while (cr.movePosition (QTextCursor::NextWord));
cr.setPosition (pos);
textEdit->setTextCursor (cr);
textEdit->document()->setModified (false);

Код довольно очевиден, поэтому сделаю лишь пару примечаний относительно тонкостей. Вызов qApp->processEvents() нужен, если вы хотите как-то уведомлять пользователя о ходе работы. В примере выше мы никак не уведомляем, но можно предусмотреть обращение к какому-нибудь QProgressBar. Если не вызывать в том же цикле processEvents(), то обновление виджетов до выхода из цикла не будет происходить, сколько бы мы ни пытались их обновлять.

Программирование проверки правописания: проверка в Qt

Также в коде использованы ухищрения, чтобы обойти некоторые неуклюжести Qt в переборе слов. Эти ухищрения помогают точно найти начало слова, а также получать слова, заключенные в кавычках, без последних. В словаре-то слова тоже без кавычек.

И напоследок скажу еще об одном способе воплощения проверки правописания в Qt (готовый пример можно найти на форуме http://www.qtcentre.org по поисковым ключам «spell check»). Посредством класса-потомка QSyntaxHighlighter можно быстро сделать динамическую проверку (по мере ввода текста). Напомню, что класс QSyntaxHighlighter (а вернее, его потомок) служит для подсветки синтаксиса языков программирования, но его можно применить и в других целях, таких как проверка правописания.



Не можете прочитать данную статью, т.к. экран вашего монитора поврежден? К сожалению, единственное решение данной проблемы - замена матрицы ноутбука (http://impuls-rnd.ru/zamena-ekrana-matritsy-noutbuka). Доверить выполнение столь сложного технологического процесса следует опытному специалисту, на роль которого идеально подойдут сотрудники сервисного центра impuls-rnd.ru.

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх