【问题标题】:How to compute height from lines in a QTextDocument?如何从 QTextDocument 中的行计算高度?
【发布时间】:2015-09-10 13:55:53
【问题描述】:

我想计算 QTextDocument 中每一行的边界矩形(位置、大小)。我试图绘制每条线提供的矩形,但我遇到了麻烦!

这就是我所做的:

QTextBlock currentBlock = tempDocument->begin();
while (currentBlock.isValid())
{
    const int nbLines = currentBlock.layout()->lineCount();
    for (int i(0); i < nbLines; ++i)
    {
        QTextLine currentLine = currentBlock.layout()->lineAt(i);

        painter->save();
        painter->setPen(QPen(Qt::blue, 1));
        painter->drawRect(currentLine.rect());
        painter->restore();
    }
    currentBlock = currentBlock.next();
}

这是我得到的:(请参阅文本 1:Text 1 - 2 - 3

它并没有真正起作用......所以我尝试自己用类似的东西来做:

float transY(tempDocument->documentMargin());
QTextBlock currentBlock = tempDocument->begin();
while (currentBlock.isValid())
{
    const int nbLines = currentBlock.layout()->lineCount();
    for (int i(0); i < nbLines; ++i)
    {
        QTextLine currentLine = currentBlock.layout()->lineAt(i);
        currentLine.setLeadingIncluded(true);

        painter->save();
        painter->setPen(QPen(Qt::blue, 1));
        painter->drawRect(QRectF(0, transY, currentLine.width(), currentLine.height()));
        painter->restore();
        transY += currentLine.height();
    }
    currentBlock = currentBlock.next();
}

每当我使用从互联网生成的原始文本时,我都会说,这是完美的:

(请参阅文本 2)

但是,如果我在段落中使用相同的文本(

),计算就会完全混乱。如何计算两个段落之间的空间?

(请参阅文本 3)

任何想法或帮助将不胜感激! 谢谢!

PS:抱歉,我本来可以发布图片但我不能!

【问题讨论】:

  • 我找到了stackoverflow.com/questions/14792074/…,但它并没有真正帮助我
  • 所有文字图片的链接都一样?
  • 我只有一个声望点,所以我不能发布图片,我只能发布一个链接。链接后面的图片代表3个文本。根据我上面所说的,每个文本都是不同的情况。我提到了“请看文字1”等。
  • 关于我的问题,一条线的宽度并不重要,我真正需要的是每条线的位置和高度。我在一个有很多页面的文本编辑器软件(比如 Word)上工作,我们可以使用浮动文本(QTextDocument)。 如果一行被限制页剪裁,我希望能够将 QTextDocument 一分为二,以便只有整行。

标签: c++ qt


【解决方案1】:

标准 Qt API 无法实现,但您可以从私有 Qt 类 QTextDocumentLayout 获得边界矩形。查看下一个公共方法:

virtual QRectF frameBoundingRect(QTextFrame *frame) const;
virtual QRectF blockBoundingRect(const QTextBlock &block) const;
QRectF tableBoundingRect(QTextTable *table) const;
QRectF tableCellBoundingRect(QTextTable *table, const QTextTableCell &cell) const;

您可以通过添加专业文件来包含私人课程

QT += gui-private

包括

#include <private/qtextdocumentlayout_p.h>

QTextDocument默认有QTextDocumentLayout,因此你可以转换文档布局并获取所需信息:

QTextDocumentLayout* pDocumentLayout = qobject_cast<QTextDocumentLayout*>(textDocument.documentLayout());

【讨论】:

    【解决方案2】:

    好吧,毕竟没那么难,我的错误是忽略了行位置是相对于其布局的。我显然使用qreal QTextLine::height() const 成功了,但请注意行位置(QPointF QTextLine::position() const)是相对于它的布局(每个文本块一个布局)。因此,我无需自己计算即可获得边界框(QRectF QTextLine::rect() const)。

    【讨论】:

      【解决方案3】:

      如果你知道一行所使用的字体,你可以用这个公式非常准确地猜测:

      QFontMetricsF fm(document.defaultFont());
      auto const height = fm.height() + fm.leading();
      

      【讨论】:

      • 这是一个带有 html 源的富文本文档,因此可以是任何混合格式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多