Малко съм объркан как работи QTextBlock::iterator
:
Документацията показва ясни примери как да го използвате в нормален текст:
QTextBlock::iterator it;
for (it = currentBlock.begin(); !(it.atEnd()); ++it) {
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid())
processFragment(currentFragment);
}
Срещам проблеми с празни редове от текст. На тези линии,
it = currentBlock.begin();
if(it.atEnd())
// returns true !
Все още трябва да мога да чета форматиране (char и block)
Трябва ли да проверя блока в края? Има ли някакъв друг начин за тестване на блокове без нищо освен новия ред?
Текущото ми решение: проверете и последния итератор, отделно от цикъла "for" и също така тествайте дали това е последният блок в документа (ако се опитам да получа фрагмента от последния блок в документа, програмата се срива ).
Изглежда, че работя срещу документацията... Как да получа форматирането на празни редове?
Редактиране:
Моето старо решение:
QTextBlock currentBlock = document()->findBlock(selStart);
QTextBlock lastBlock = document()->lastBlock();
while (currentBlock.isValid())
{
QTextBlock::iterator it = currentBlock.begin();
if(currentBlock != lastBlock && it.atEnd())
{
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid())
{
QTextCharFormat f = currentFragment.charFormat();
// do something
}
}
else
{
for (; !(it.atEnd()); ++it)
{
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid())
{
// do stuff
QTextCharFormat f = currentFragment.charFormat();
// do stuff
}
}
}
}
Ново решение, базирано на отговор от Tarod, елиминира един тест (но изглежда има по-малко последователно поведение)
QTextBlock currentBlock = document()->findBlock(selStart);
QTextBlock lastBlock = document()->lastBlock();
while (currentBlock.isValid())
{
QTextBlock::iterator it = currentBlock.begin();
if(currentBlock != lastBlock && it.atEnd())
{
QTextCharFormat f = currentBlock.charFormat();
// do something
}
else
{
for (; !(it.atEnd()); ++it)
{
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid())
{
// do stuff
QTextCharFormat f = currentFragment.charFormat();
// do stuff
}
}
}
}
Все още трябва да проверя спрямо последния блок и да избягвам да го използвам, ако е празен, понякога се срива.