2012-03-21 130 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庫引起的。切換到「調試」版本後,異常消失。