QT 获取QTextEidt 自动换行后的行数

如果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 包含光标当前位于的行号
  1. 遍历块:代码使用 while 循环遍历 QTextEdit 中的每个 QTextBlock。

  2. 计算行数:对于每个 QTextBlock,它使用 block.layout() 检索其 QTextLayout。此布局对象表示该块内文本的渲染方式,考虑了诸如行尾折行等因素。

  3. 累计行计数layout->lineCount() 给出了当前块布局中的行数。这个总和被累积到 lineCount 中,给出了 QTextEdit 中的总行数。

  4. 找到当前行号:循环内部,它检查当前 QTextBlock 是否包含光标的位置(cursor.position())。如果为真,它使用 layout->lineForTextPosition() 确定当前块中光标的位置所在的行号。lineNumber 通过给 textLine.lineNumber() 加 1 调整为更适合人类阅读的

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值