LINUX.ORG.RU

QTextEdit: Применение форматирование к выделенному тексту.

 


0

2

В моем редакторе, основанном на QTextEdit, необходимо сделать кнопку очистки форматирования выделенного текста.

Проблема в том, что setBlockFormat(), вопреки документации, применяет свое форматирование только для первого абзаца в выделенном тексте. А остальные абзацы не трогает. Причем, делает это как-то выборочно - некоторые виды форматирования применяет для всего выделенного текста, некоторые - только для первого абзаца в выделенном тексте.

Вот например, следующий код должен установить top и bottom отступ в 50 pix. И должен сделать это для всех абзацев в выделенном тексте, ибо «Sets the block format of the current block (or all blocks that are contained in the selection) to format.»

   QTextEdit textArea;

   ...

   QTextBlockFormat format;

   // Убираются отступы
   format.setLeftMargin(0);
   format.setRightMargin(0);
   format.setTopMargin(50); // 50 - для отладки, чтобы было видно обработку абзаца
   format.setBottomMargin(50);
   format.setAlignment(Qt::AlignLeft); 

   textArea->textCursor().setBlockFormat(format);

Однако, на деле, вертикальные отступы в 50 pix устанавливаются только первому абзацу (когда выбрали, например мышкой, сразу три абзаца). А нужно, чтобы отступы в 50 pix устанавливались всем абзацам.

Я решил тогда пробегать все блоки, которые содержатся в выделенном мышкой фрагменте. Сделал так:

   QTextCursor cursor(textArea->textCursor());
   for (QTextBlock::iterator it = cursor.block().begin(); !(it.atEnd()); ++it)
   {
       qDebug() << "Block iterator position: " << it.fragment().position() << " Fragment len: " << it.fragment().length();

       QTextCursor tempCursor = cursor;
       tempCursor.setPosition(it.fragment().position());
       tempCursor.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor);
       tempCursor.setBlockFormat(format);
   }

И в отладке вижу, что даже если выделено несколько абзацев (на ~300 символов), в итераторе пробегается только один абзац:

Block iterator position:  3519  Fragment len:  35

Вопрос. Как же пробежать все абзацы в выделении и применить им нужное форматирование?

★★★★★

QTextDocument::blockCount() что говорит? сырцы кути надо бы глянуть, как они блоки считают.
ну и html-ину выложи где-нибудь (только из дебага выведенную)

dib2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.