Qt计算一列竖文本的尺寸

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    auto font = this->font();
    font.setPixelSize(30);
    setFont(font);
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setPen(Qt::red);
    painter.setFont(this->font());

    QString s = "会须一饮sf0.三百杯eso.,";
    QString str = s.split("", Qt::SkipEmptyParts).join("\n");

    painter.drawText(rect(), Qt::AlignCenter ,str);

    auto r = painter.boundingRect(rect(), Qt::AlignCenter ,str);
    painter.drawRect(r);

    painter.setPen(Qt::cyan);

    QSize size = getVerticalTextBoundingRect(str);
    painter.drawRect(QRect(r.x(),r.y(),size.width(),size.height()));
}

QSize Widget::getVerticalTextBoundingRect(const QString & str)
{
    QFontMetrics fm(font());

    QStringList lines = str.split("\n");

    int maxWidth = 0;
    int totalHeight = 0;

    for (const QString &line : lines)
    {
        int width = fm.horizontalAdvance(line);
        if (width > maxWidth)
        {
            maxWidth = width;
        }
        totalHeight += fm.height();
        totalHeight += fm.leading();
    }
    totalHeight -= fm.descent();

    return QSize(maxWidth, totalHeight);
}

可见其结果基本和 QPainter 的 boundingRect() 是一致的。

相关博文:

QFontMetrics-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值