销毁QGlyphRuns的容器失败

时间:2012-03-21 13:10:53

标签: visual-c++ qt4

我正在尝试浏览QTextEdit小部件中的字形集,但无法解决以下问题:在检索到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-&gt; setupUI()之后)。

我正在使用QT 4.8非商业版与MSVC ++ 2010 express。有没有人知道为什么会这样?以及如何解决它?

提前致谢。

2 个答案:

答案 0 :(得分:0)

为什么你的代码结构如下:

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

而不是

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

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

答案 1 :(得分:0)

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