IscanderChe
Dec. 8, 2023, 5:20 p.m.

Побуквенное сравнение двух строк

Добрый день всем.

Разрабатываю клавиатурный тренажёр.
Для того, чтобы выделить ошибки в набираемом тексте, я привязался к сигналу QTextEdit void textChanged(). Если строка уменьшается, то всё нормально. Если же увеличивается "неправильным" символом, то программа зацикливается на слоте, соединённым с указанным сигналом.

Вот код:

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. {
  4. m_document = new QTextDocument();
  5. m_textEdit = new QTextEdit(this);
  6. ...
  7. m_textEdit_2 = new QTextEdit(this);
  8. m_document = m_textEdit->document();
  9. m_document->setPlainText("abcdefghijklmnopqrstuvwxyz");
  10. m_document = m_textEdit_2->document();
  11. m_document->setPlainText("abcdefghijklmnopqrstuvwxyz");
  12. ...
  13. connect(m_textEdit, &QTextEdit::textChanged, this, &Widget::slotTextChanged);
  14. }
  15.  
  16. void Widget::slotTextChanged()
  17. {
  18. QString line_1 = m_textEdit->toPlainText(); // здесь текст редактируется
  19. QString line_2 = m_textEdit_2->toPlainText(); // здесь лежит эталонная строка
  20.  
  21. QVector<int> errors;
  22.  
  23. if(line_1 != line_2)
  24. {
  25. for(int i = 0; i < line_1.size(); ++i)
  26. {
  27. QChar c_1 = line_1.at(i);
  28. QChar c_2 = line_2.at(i);
  29.  
  30. if(c_1 != c_2)
  31. {
  32. errors.push_back(i);
  33. }
  34. }
  35. }
  36.  
  37. QTextCursor cursor(m_textEdit->document());
  38. cursor.setCharFormat(oldFmt);
  39. QTextCharFormat fmt;
  40. fmt.setBackground(Qt::blue);
  41.  
  42. for(int i = 0; i < errors.size(); ++i)
  43. {
  44. int begin = errors.at(i) - 1;
  45. int end = errors.at(i);
  46.  
  47. cursor.setPosition(begin, QTextCursor::MoveAnchor);
  48. cursor.setPosition(end, QTextCursor::KeepAnchor);
  49. cursor.setCharFormat(fmt);
  50. }
  51. }
2
1
Evgenii Legotckoi
  • Dec. 12, 2023, 5:48 p.m.

Добрый день.
Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста?
Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и подключать обратно в конце слота

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
    • A
      Oct. 19, 2024, 5:19 p.m.
      Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html