【发布时间】:2015-12-29 19:13:23
【问题描述】:
我对@987654321@ 的工作原理有点困惑:
文档在普通文本上显示了如何使用它的清晰示例:
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 !
我仍然需要能够读取格式(字符和块)
我应该检查最后的块吗?除了新行之外,还有其他方法可以测试块吗?
我当前的解决方案:也检查最后一个迭代器,与“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
}
}
}
}
我仍然需要检查最后一个块,如果为空,请避免使用它,有时它会崩溃。
【问题讨论】:
标签: qt formatting qgraphicsitem qgraphicstextitem