2013-03-03 48 views
2

我在QPlainTextEdit,其中每行開頭10位一些文字:QTextCursor和beginEditBlock

  line1 
      line2 
      line3 
      line4 

於是,我選擇幾行,在一個循環中我想刪除所有選中的行前兩個空間:

cursor.beginEditBlock(); 
for (QTextBlock block = startBlock; block != endBlock; block = block.next()) { 
    cursor.setPosition(block.position()); 
    cursor.setPosition(block.position() + 2, QTextCursor::KeepAnchor); 
    cursor.removeSelectedText(); 
} 
cursor.endEditBlock(); 

的問題是,「損害」最後選定的行上面的代碼 - 因爲它去掉某種結束行標誌的 - 當我想跳到最後一行光標結束在第一個字符和第二個字符之間移動到它下面的行。即使編輯後的選擇也不能正確顯示 - 除最後一行之外的所有行都將選擇指示符擴展到右側窗口邊緣,最後一行的指示符只與行一樣寬。

 line1 < 1. selected lines, run the code 
     line2 < 
     line3 <  < 2. here I jump to end of line 
|  line4 

^ 3. cursor appears here 

當我刪除beginEditBlock()endEditBlock()一切工作正常。

請問,有誰知道爲什麼會發生這種情況?

+0

你有沒有找到一個解決辦法?我想我可能會遇到PyQt中的相同問題:http://stackoverflow.com/questions/29320202/ – 2015-03-28 17:33:14

+1

@MichaelClerx IIRC它被固定在5.3.0,你可以看到[這裏]的更改(https:// codereview.qt-project.org/#/c/83583/)。 – 2015-03-29 16:30:49

+0

謝謝!我已經要求他們在4.8中修復它! – 2015-03-29 16:41:40

回答

1

使用此條件block != endBlock您的光標將永遠不會到達最後一個塊。 你應該使用這樣的:

QTextBlock block = document->firstBlock(); 
while (block.isValid()) 
{ 
    // do your stuff 
    block = block.next(); 
} 
+0

我發佈了有問題的代碼,它上面基本上有類似'end = end.next()'的東西。在任何情況下,無論是最後一行還是最後一行,該行都會「損壞」。 – 2013-03-04 09:05:28

+0

'end' < - 'endBlock' – 2013-03-04 09:15:42

相關問題