私はどのように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 からの回答に基づく新しいソリューションでは、1 つのテストが省略されます (ただし、動作の一貫性が低いようです)。
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
}
}
}
}
最後のブロックをチェックし、空の場合は使用しないようにする必要があります。クラッシュすることがあります。