Програмування перевірки правопису: перевірка в qt

Відео: Перевірити написання слів в Word

Програмування перевірки правопису: перевірка в 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-gt; textCursor () - int pos = cr.position ();
// отримуємо весь текст з віджета QString text = textEdit-gt; 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-gt; 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-gt; setTextCursor (cr) -
textEdit-gt; document () - gt; setModified (false) -

Код досить очевидний, тому зроблю лише пару приміток щодо тонкощів. Виклик qApp-gt; processEvents () потрібен, якщо ви хочете якось повідомляти користувача про хід роботи. В наведеному вище прикладі ми ніяк не хочемо сповістити, але можна передбачити звернення до якого-небудь QProgressBar. Якщо не викликати в тому ж циклі processEvents (), то оновлення віджетів до виходу з циклу не буде відбуватися, скільки б ми не намагалися їх оновлювати.

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

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

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



Чи не можете прочитати цю статтю, тому що екран вашого монітора пошкоджений? На жаль, єдине рішення даної проблеми - заміна матриці ноутбука (https://impuls-rnd.ru/zamena-ekrana-matritsy-noutbuka). Довірити виконання такого складного технологічного процесу слід досвідченого фахівця, на роль якого ідеально підійдуть співробітники сервісного центру impuls-rnd.ru.

ІНШЕ

Juce: вкладені компонування фото

Juce: вкладені компонування

вкладені компонування У Juce використовується ідеологія, розглянута в попередній статті по U ++, - ієрархія віджетів…

Неясності з phonon фото

Неясності з phonon

Від труднощів збірки перейдемо до неясним місцях у використанні Phonon. Phonon підтримує ті мультимедійні формати, які…

Бесіди про qt: qsettings і xml фото

Бесіди про qt: qsettings і xml

Клас QSettings служить Qt-програмістам вірою і правдою, коли потрібно зберегти або завантажити будь-які налаштування…

» » Програмування перевірки правопису: перевірка в qt