2011-12-01 19 views
2

我想映射QMap對象中的兩個指針以存儲它們的關係。鍵指針指向一個QTextBlock,而值指針指向一個小部件。目的是在QPlainTextEdit中的某些內容發生變化時更新小部件相對於QPlainTextEdit中QTextBlock位置的位置。當QTextBlock被破壞時,小部件應該被銷燬。在QPlainTextEdit中獲取指向QTextBlock的指針

但是,我不熟悉QPlainTextEdit中QTextBlock的行爲。雖然firstVisibleBlock()方法似乎沒有返回指向QPlainTextEdit中的QTextBlock的指針,但我用QPlainTextEdit中的QTextBlock作爲參數創建了一個新的QTextBlock。

QTextBlock* CodeEditor::getBlockAtPosition(QPoint position) { 

    QTextBlock block = firstVisibleBlock(); 
    while (true) 
    { 
     QRectF blockDim = blockBoundingGeometry(block).translated(contentOffset()); 
     if (position.y() <= blockDim.bottom() && position.y() >= blockDim.top()) 
     { 
      break; 
     } 
     else if (block.blockNumber() + 1 < blockCount()) 
     block = block.next(); 
     else break; 
    } 
    return new QTextBlock (block); 
} 

那麼,這似乎工作,因爲當我通過按下回車鍵/返回背後指針改變對象的屬性,如預期增加新線(QTextBlocks)到QPlainTextEdit。這意味着如果你在相關塊之前插入一行,blockNumber會增加,幾何/位置也會改變。

但是,如果刪除相關行(backspace/del),指針仍指向QPlainTextEdit中的QTextBlock - 我不知道如何或爲什麼。當我在指針值上調用isValid()方法時,它返回true。

那麼,爲什麼屬性會改變它是一個新的QTextBlock對象?有沒有辦法獲得QPlainTextEdit中的QTextBlock的直接指針或引用?

+0

你有沒有嘗試insertText()在「dangling」QTextBlock?你檢查了QTextBlock :: isVisible屬性嗎? – ibizaman

回答

0

我知道這是一個古老的問題,但我在尋找類似問題的解決方案時偶然發現了這個問題,因此我正在回答記錄我發現的可能與未來搜索相關的內容。

我試圖附加一些外部標記連接到特定的行,即使編輯插入/刪除其他行。問題是,即使刪除了連接到標記的行,該塊對象也被重用,所以標記移動到了錯誤的位置。

該解決方案使用了文本塊的用戶數據功能。當某個塊被「刪除」並重新使用時,用戶數據將被刪除。所以我的標記繼承自QTextBlockUserData,我將標記設置爲塊的用戶數據,並在標記中保留對塊的引用。 然後,有效性測試僅僅是比較標記對象和塊保存的用戶數據。似乎工作。

相關問題