2016-10-17 55 views
1

我可以通過QTextCursor :: blockNumber()QTextCursor :: positionInBlock()得到ROW和COL的當前位置。我的問題是,如何將光標移動到具有行和列的特定位置。像的Qt:如何將文本編輯光標到特定關口和行

setPosition(x,y) // The current cursor would move to row x and col y. 

有沒有可能這樣做?

回答

3

簡單的解決方案:

只需將光標移動有:

textEdit.moveCursor(QTextCursor::Start); //set to start 
for(<... y-times ...>) 
{ 
    textEdit.moveCursor(QTextCursor::Down); //move down 
} 
for(< ... x-times ...>) 
{ 
    textEdit.moveCursor(QTextCursor::Right); //move right 
} 

moveCursor也是後藤方式,如果您需要將其更改爲「中選擇」文本。最後還有一個沒有循環的類似方法。

多一點的解釋,也許更好的解決方案:

在理論文本有像顯示在圖形用戶界面,但沒有「線」的endline-character\n\r\n取決於操作系統和框架上)只只是另一個角色。所以對於遊標來說,大多數情況下,只有一個「文本」沒有行。

有包裝功能來處理這個問題,但我稍後再討論它們。首先,您不能直接通過QTextEdit界面訪問這些界面,但必須直接操作光標。

QTextCursor curs = textEdit.textCursor(); //copies current cursor 
//... cursor operations 
textEdit.setTextCursor(curs); 

現在的「操作」:

如果你知道你想要的字符串中去什麼位置,你有setPosition()這裏。這個「位置」雖然不是垂直線,而是整個文本。

這是一個多行字符串內部的外觀:

"Hello, World!\nAnotherLine" 

這表明

Hello, World! 
AnotherLine 

setPosition()希望內部字符串的位置。

要移動到另一行,您必須通過在文本中查找第一個\n來計算位置並添加您的x偏移量。如果你想第三行看第2 \n

幸運的是,也有功能setVerticalMovement這似乎包裝這個,也許是你想要做的。它垂直移動光標。

所以,你可以這樣做:

curs.setPosition(x); //beginning at first line 
curs.setVerticalMovement(y); //move down to the line you want. 

上面的光標顯示,呼叫setTextCursor等之後。

注:

的順序很重要,但。 設置全文中的位置。所以setPosition(5)雖然也許在第三行而不是將它設置爲你所在行中的第五個字符,但是是整個文本。所以先移動x座標,然後移動y。


您需要注意線條的長度。

some longer line 
short 
another longer line 

如果您現在指定第2行和第7列,它將是「超出界限」。我不確定verticalMovement在這裏的表現如何。我假設光標將在行的末尾。


當您使用QTextCursor類直接您還可以使用移動操作不循環,因爲他們有一個額外的參數重複操作。

curs.movePosition(QTextCursor::Start); 
curs.movePosition(QTextCursor::Down,<modeMode>,y); //go down y-times 
curs.movePosition(QTextCursor::Right,<moveMode>,x); //go right x-times 
+0

很好的答案。你有我的upvote :) – Tarod

+0

@塔羅德thx。考慮到問題的長度,這可能有點太多,雖然:D – Hayt

+0

Nah,這是一個非常好的解釋;) – Tarod

3

我認爲最好的方法是通過QTextCursor

例如,如果您QTextEdit被稱爲textEdit

QTextCursor textCursor = ui->textEdit->textCursor(); 

textCursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, x); 
textCursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, y); 

ui->textEdit->setTextCursor(textCursor); 

xy是需要的位置。

+0

你應該將它首先移動到開始。 – Hayt

+0

取決於應用程序。我不知道最初的狀態。但是,是的,這可能是必要的。至少對於連續呼叫來說,這個號碼是 – Tarod

+0

。 – Hayt