我可以通过使用来获取光标所在的行QTextEdit.textCursor().blockNumber()
,但是当一行换成多行时,它不能返回实际的行号。
我怎样才能做到这一点?
我可以通过使用来获取光标所在的行QTextEdit.textCursor().blockNumber()
,但是当一行换成多行时,它不能返回实际的行号。
我怎样才能做到这一点?
我不确定它会起作用,所以我编写了一个快速测试应用程序(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));
}
这是 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
QTextCursor
有很多有用的方法,比如:
int QTextCursor::position () const
返回光标在文档中的绝对位置。光标位于字符之间。
和
int QTextCursor::positionInBlock () 常量
返回光标在块内的相对位置。光标位于字符之间。
这相当于position() - block().position()
.