LINUX.ORG.RU

Перебор блоков и фрагментов QTextDocument при изменении этого QTextDocument

 ,


0

1

Имеется некий документ, нужно перебрать его блоки, а в блоках перебрать фрагменты. И некоторые фрагменты, которые попадают под определенные условия, надо изменить. Они могут стать длиннее, чем исходные. Для изменения фрагмента берется позиция фрагмента в документе, и правится документ (ибо объекты фрагмента и блока в Qt не имеют методов модификации).

Проблема в том, что код изменения документа обернут двумя циклами - перебор блоков текста документа и перебор фрагментов в блоке. И если в процессе работы этих циклов будет меняться документ, то как поведут себя эти циклы? Будут ли они работать правильно?

  QTextDocument textDocument=...;

  // Перебор блоков текста
  QTextBlock textBlock = textDocument.begin();
  while(textBlock.isValid())
  {

    // Перебор фрагментов в блоке текста
    QTextBlock::iterator it;
    for(it = textBlock.begin(); !(it.atEnd()); ++it)
    {
      QTextFragment currentFragment = it.fragment();
      int position=currentFragment.position();

      //////////////////////////////////////////////
      // Тут меняем textDocument в позиции position
      //////////////////////////////////////////////
    }
    textBlock = textBlock.next();
  }


★★★★★

А зачем все время весь документ перебирать? Почему в процессе редактирования не производить нужные проверки и изменения. Это как минимум будет производительнее. Если это не выход(я все же не знаю что за задачу ты решаешь), то запрещай редактирование текста на момент прохода проверки(она же у тебя в отдельном потоке? иначе думаю что оно и без запрета зависнет что ничего не отредактируешь).

Noob_Linux ★★★★
()
Ответ на: комментарий от Noob_Linux

А зачем все время весь документ перебирать? Почему в процессе редактирования не производить нужные проверки и изменения.

Не все время.

Этот код запускается один раз при вставке текста из буфера обмена.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Noob_Linux

Если это не выход(я все же не знаю что за задачу ты решаешь), то запрещай редактирование текста на момент прохода проверки(она же у тебя в отдельном потоке?

Проверка у меня в отдельном модальном виджете, который открывается поверх области редактирования.

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

В приведенном коде (он сильно упрощен) вычленяются урлы картинок и заменяются на внутренние имена.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Не вижу проблемы. Ну вставили мы в этот виджет текст из буфера обмена. Нажали ок. Проверка отработала. Сделала свои дела. Область редактирования стала доступна пользователю. Пользователь никак не может влиять на текст во время работы этих циклов.

Noob_Linux ★★★★
()
Последнее исправление: Noob_Linux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.