如何使用QFontMetrics boundingRect来测量multilne消息的大小?

时间:2016-06-07 06:19:09

标签: qt

我想实现一个QGraphicsElement,它在圆角矩形内“按原样”绘制文本。

为了实现QGraphicsElement,我需要实现boundedRect函数,所以我需要boundedRect作为多行消息。

据我所知,这是我需要使用http://doc.qt.io/qt-4.8/qfontmetrics.html#boundingRect-6的函数,因为它说它会将换行符作为换行符处理。

现在我的问题是,如果我想知道的信息是文本的boundedRect,为什么我需要将boundedRect作为参数传递?

有人能举例说明如何获得多线QString的bo​​undedRect吗?或者,我是否需要手动计算换行符,并通过单行高度多次计算?

编辑:

由于arhzu显示作为参数传递的QRect用于定义多行文本的包含方式。但是,这没用。因为我希望所述边界框的wdth是这样的,所以不使用自动换行。这应该只是最长字符串的宽度。所以,我再次问,无论如何要获得这个?或者我应该用换行符分割字符串,然后简单地添加高度并使用找到的最大宽度?

1 个答案:

答案 0 :(得分:4)

rect的{​​{1}}参数约束输入文本的布局。您可以使用QFontMetrics::boundingRect标志将长行包装到约束rect中的多行。这是一个允许文本宽度变化的例子:

Qt::TextWordWrap

在我的系统上运行它

#include <QApplication>
#include <QFontMetrics>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFontMetrics fm = a.fontMetrics();

    QString text = QLatin1String("Multiline text string\n"
                                 "containing both long lines and line breaks\n"
                                 "to\n"
                                 "demonstrate bounding rect calculation");

    QList<int> widths = QList<int>() << 100 << 200 << 1000;
    foreach(int width, widths) {
        qDebug() << "With word wrapping:" << fm.boundingRect(QRect(0,0,width,100), Qt::TextWordWrap, text);
    }

    foreach(int width, widths) {
        qDebug() << "No wrapping" << fm.boundingRect(QRect(0,0,width,100), 0, text);
    }

    return 0;
}

编辑:添加了边界矩形计算,没有自动换行。在这种情况下,似乎没有使用边界矩形参数。