Visual c++ 销毁QX的容器失败

Visual c++ 销毁QX的容器失败,visual-c++,qt4,Visual C++,Qt4,我试图在QTextEdit小部件中浏览一组glyph,但无法克服以下问题:检索到Qglyph运行列表后,无法对其进行分解 以下是获取QGlyph运行列表的代码: QTextDocument* doc = ui->textEdit->document(); QTextBlock block = doc->begin(); while(block.isValid()) { QTextLayout* tl = block.layout(); { QLi

我试图在QTextEdit小部件中浏览一组glyph,但无法克服以下问题:检索到Qglyph运行列表后,无法对其进行分解

以下是获取QGlyph运行列表的代码:

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();
}
QTextDocument*doc=ui->textEdit->document();
QTextBlock block=doc->begin();
while(block.isValid())
{
QTextLayout*tl=block.layout();
{
QList glyphs=tl->glyphrun();
//退出块时,会在此处引发异常
}       
block=block.next();
}
当字形被破坏时,我得到_BLOCK_TYPE_is_VALID断言失败。我一直在尝试几种方法来启动上面的代码:

  • 简单槽
  • 在单独线程中处理的插槽(使用和不使用moveToThread函数)
  • 作为事件处理程序(该事件由QApplication的postEvent方法触发)
但这些都无助于摆脱这个例外。唯一没有出现的情况是从MainWindows构造函数调用上述代码(在调用ui->setupUI()之后)

我正在MSVC++2010 express中使用Qt4.8非商业版。有人知道为什么会这样吗?如何解决这个问题


提前感谢。

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

do
{
//... 
}
while(block.isValid());
而不是

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

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

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

你好,特卡姆,是的,谢谢你给我指路。出于某种原因,我假设必须始终至少有一个有效块(因为当textedit的上下文更改时调用此函数)。但这是不正确的,因为删除内容也是一种改变。我已经更正了代码,但是这个bug似乎与原始问题无关,因为异常仍然出现。再次感谢。