2012-03-21 93 views
1

我试图通过QTextEdit小部件中的字形集进行导航,但无法克服以下问题:在检索到QGlyphRuns列表后,无法将其解散。QGlyphRuns容器遭到破坏

这里是获取QGlyphRuns列表代码:

QTextDocument* doc = ui->textEdit->document(); 
QTextBlock block = doc->begin(); 
while(block.isValid()) 
{ 
    QTextLayout* tl = block.layout(); 
    { 
     QList<QGlyphRun> glyphs = tl->glyphRuns(); 
     // the exception raises here, upon exiting the block 
    }  
    block = block.next(); 
} 

当字形是越来越破坏我得到_BLOCK_TYPE_IS_VALID断言失败。我一直在尝试了多种方法来启动上面的代码:

  • 简单插槽
  • 插槽在一个单独的线程来处理(有和没有使用moveToThread功能)
  • 为事件处理(事件被QApplicaiton的postEvent方法解雇)

但是这些都没有帮助摆脱例外。唯一的情况是,当上面的代码从MainWindows构造函数调用时(在调用ui-> setupUI()之后)。

我使用MSVC++ 2010 express的QT 4.8非商业版本。有人知道为什么会发生吗?以及如何解决它?

在此先感谢。

回答

0

为什么你的代码结构是这样的:的

do 
{ 
//... 
} 
while(block.isValid()); 

代替

while(block.isValid()) 
{ 
//... 
} 

在前一种情况下,代码至少运行一次,因为有效性的代码块之后只检查,所以我猜你在第一个块无效的情况下得到了异常。如果您将其更改为后一种格式,则只会在第一个块无效时跳过该代码。

+0

嗨,teukkam, 是的,谢谢你指点我。由于某种原因,我认为必须至少有一个有效的块(因为当textedit的上下文被改变时调用该函数)。但这是不正确的,因为删除内容也是一个变化。 我已更正了代码,但此错误似乎与原始问题无关,因为该例外依然出现。 再次感谢。 – Ant 2012-03-21 14:08:00

0

我发现问题是由于在项目的“调试”版本中使用“发布”QT库引起的。切换到“调试”版本后,异常消失。