如果QTextEdit 不自动换行,那么可以通过这两种方式获取总行数。
法1. QTextCursor tc = fileedit_window->textCursor(); //当前光标
QTextLayout *lay = tc.block().layout();
int curpos = tc.position() - tc.block().position();//当前光标在本BLOCK内的相对位置
int textline = lay->lineForTextPosition(curpos).lineNumber() + tc.block().firstLineNumber()+1;
法2. int textline = fileedit_window->document()->lineCount();
但是如果存在自动换行,那么再用上面的方式行数就获取错误了。
可以用下面的方式获取总行数
//获取一个block 的折叠行数
void getTextLineCount(QTextBlock& block, int& lineCount)
{
QTextLayout *lay = block.layout();
if(block.position() == 0)
{
lineCount += lay->lineCount();
return;
}
else
{
lineCount += lay->lineCount();
QTextBlock prev = block.previous();
if(prev.isValid())
{
getTextLineCount(prev,lineCount);
}
}
}
QTextCursor tcTemp = ui->textEdit->textCursor(); //当前光标备份,最后要设置回来
QTextCursor cursor = ui->textEdit->textCursor();
cursor.movePosition(QTextCursor::End);
ui->textEdit->setTextCursor(cursor); //设置到末尾
QTextCursor tc = ui->textEdit->textCursor(); //重新获取一次当前光标
QTextBlock block = tc.block();
QTextLayout *lay = block.layout();
int curpos = tc.position() - block.position();//当前光标在本BLOCK内的相对位置
int lineNumber = lay->lineForTextPosition(curpos).lineNumber() + 1;
int lineCount = 0; //行数
getTextLineCount(block, lineCount);//获取行数
lineCount -= lay->lineCount();
lineCount += lineNumber;
ui->textEdit->setTextCursor(tcTemp);//设置回原来的坐标
法2还不行的,试试法3:
int lineCount = 0;
int currentLineNumber = 0;
QTextCursor cursor = ui->textEdit->textCursor();
QTextBlock block = cursor.block();
// 遍历每个块来计算行数
while (block.isValid()) {
QTextLayout *layout = block.layout();
if (layout) {
// 增加当前块布局中的行数
lineCount += layout->lineCount();
// 检查当前块是否包含光标位置
if (block.contains(cursor.position())) {
// 找到当前块中光标的位置所在的行号
QTextLine textLine = layout->lineForTextPosition(cursor.position() - block.position());
currentLineNumber = textLine.lineNumber() + 1; // 行号是从零开始的,所以加1
}
}
block = block.next(); // 移动到下一个块
}
// 现在 lineCount 包含 QTextEdit 中的总行数
// 而 currentLineNumber 包含光标当前位于的行号
-
遍历块:代码使用
while
循环遍历 QTextEdit 中的每个 QTextBlock。 -
计算行数:对于每个 QTextBlock,它使用
block.layout()
检索其 QTextLayout。此布局对象表示该块内文本的渲染方式,考虑了诸如行尾折行等因素。 -
累计行计数:
layout->lineCount()
给出了当前块布局中的行数。这个总和被累积到lineCount
中,给出了 QTextEdit 中的总行数。 -
找到当前行号:循环内部,它检查当前 QTextBlock 是否包含光标的位置(
cursor.position()
)。如果为真,它使用layout->lineForTextPosition()
确定当前块中光标的位置所在的行号。lineNumber
通过给textLine.lineNumber()
加 1 调整为更适合人类阅读的