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 调整为更适合人类阅读的

### Qt 5.9 QPushButton 文本自动换行的实现 在 Qt 中,默认情况下 `QPushButton` 的文本不会自动换行。为了实现按钮文本的自动换行功能,可以通过调整布局策略以及设置特定的属性来完成。 以下是具体的方法: #### 方法一:使用 `word-wrap` 和自定义样式表 可以利用 CSS 样式中的 `white-space` 属性配合 `word-break` 来控制文字换行行为。通过设置按钮的样式表,可以让其支持多行显示并自动换行[^3]。 ```cpp #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("这是一个很长的按钮文本,用于测试自动换行的功能"); // 设置按钮的固定宽度以触发换行效果 button.setFixedWidth(200); // 使用样式表启用自动换行 button.setStyleSheet( "text-align:left;" "padding: 8px;" "white-space: pre-wrap;" // 启用换行 "word-break: break-word;" // 断字处理 ); button.show(); return app.exec(); } ``` 上述代码中设置了固定的按钮宽度,并通过样式表启用了 `pre-wrap` 模式允许文本换行[^3]。 --- #### 方法二:嵌入 QLabel 并手动管理换行逻辑 如果希望更灵活地控制换行逻辑,则可以在按钮内部嵌套一个 `QLabel` 控件,并让该标签负责实际的文字渲染工作。这种方式能够更好地兼容复杂的富文本场景[^4]。 ```cpp #include <QApplication> #include <QPushButton> #include <QVBoxLayout> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout(&window); QPushButton button("点击这里查看内容"); QLabel* label = new QLabel("<b>这是一段非常长的内容</b><br/>它会被强制分成两行或者更多行!"); label->setWordWrap(true); // 开启自动换行 QObject::connect(&button, &QPushButton::clicked, [&]() { QMessageBox::information(nullptr,"提示",label->text()); }); layout.addWidget(button); layout.addWidget(label); window.resize(300, 150); window.show(); return app.exec(); } ``` 此示例展示了如何在一个独立窗口里组合多个控件共同协作完成目标需求[^4]。 --- #### 注意事项 - **版本适配**:虽然以上两种方式都可以适用于大多数现代桌面应用程序开发环境之中,但在某些特殊平台上可能仍需额外验证其表现一致性。 - **性能考量**:对于频繁更新界面的应用程序来说,动态修改大量 UI 元素可能会带来一定开销,在设计初期就应该考虑到这一点[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值