В моем редакторе, основанном на 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
Вопрос. Как же пробежать все абзацы в выделении и применить им нужное форматирование?