2013-04-04 55 views
2

我可以通過使用QTextEdit.textCursor().blockNumber()獲取光標的行,但是當一行換行到多行時,它不能返回實際的行號。如何獲取實際可見光標的行號

我該怎麼做?

+0

扭曲線通常被視爲一條線,我所有的編輯器的工作原理類似:Notpad ++,VI,...。 – 2013-04-04 15:50:02

+0

當然,我使用Vim。但我需要在「TextEdit」的「實際」行下彈出一個窗口,所以我必須這樣做...... – 2013-04-04 16:06:08

回答

3

我不知道它會工作,所以我寫了一個快速測試應用(QT 5.0.1)和工作的,這裏是一塊吧:

void MainWindow::on_plainTextEdit_cursorPositionChanged() 
{ 
    QPlainTextEdit *edit = qobject_cast<QPlainTextEdit *>(sender()); 
    Q_ASSERT(edit); 
    QTextCursor cursor = edit->textCursor(); 
    cursor.movePosition(QTextCursor::StartOfLine); 

    int lines = 1; 
    while(cursor.positionInBlock()>0) { 
     cursor.movePosition(QTextCursor::Up); 
     lines++; 
    } 
    QTextBlock block = cursor.block().previous(); 

    while(block.isValid()) { 
     lines += block.lineCount(); 
     block = block.previous(); 
    } 
    ui->label->setText(QString::number(lines)); 
} 
+0

真棒解決方案!我只是把它翻譯成Python,它的工作原理!我在TextEdit中填入一些'a'來猜測每一行的文本長度。這是非常討厭的。 – 2013-04-05 10:34:03

+0

第一個while循環對我來說不起作用b/c它正在計算包​​裝線。下面會發布另一個解決方案 – Wingware 2013-11-01 16:28:46

+0

@Wingware是它計算被包裝的行,因爲它有問題(請參閱問題中的註釋)。如果你不想計算包裝線,那麼只需計算塊(代碼更簡單)。 – 2013-11-02 21:44:16

-1

QTextCursor有很多有用的方法,如:

int QTextCursor::position() const 

返回文檔中的光標的絕對位置。光標位於字符之間。

INT QTextCursor :: positionInBlock()const的

返回塊內的光標的相對位置。光標位於字符之間。

這相當於position() - block().position()

+0

'position()'返回字符的長度。我需要一個可見的行號... – 2013-04-04 16:07:36

1

這裏是用Python類似的解決方案。它修復了我在上面評論中提到的問題。這是在QTextEdit子類中的方法:

def getLineAtPosition(self, pos): 
    cursor = self.textCursor() 
    cursor.setPosition(pos) 

    cursor.movePosition(QTextCursor.StartOfLine) 
    lines = 0 

    lines_text = cursor.block().text().splitlines() 
    lines_pos = 0 
    for line_text in lines_text: 
    lines_pos += len(line_text) + 1 
    if lines_pos > cursor.position() - cursor.block().position(): 
     break 
    lines += 1 

    block = cursor.block().previous() 
    while block.isValid(): 
    lines += block.lineCount() 
    block = block.previous() 

    return lines 
+0

這顯示了物理線路,而不是顯然OP所需的包裝線(抱歉,我的困惑)。仍然可能有用,所以留在這裏。請注意,如果您設置了具有
生產線的HTML()w /文本,這將起作用。然而,顯然這種情況下只有一個區塊。 – Wingware 2013-11-04 21:37:59

相關問題