为啥 QFontMetrics 提供的宽度与 Qml Rectangle/Text 显示的宽度不匹配

Posted

技术标签:

【中文标题】为啥 QFontMetrics 提供的宽度与 Qml Rectangle/Text 显示的宽度不匹配【英文标题】:Why is there a mismatch in width provided by QFontMetrics and width shown by Qml Rectangle/ Text为什么 QFontMetrics 提供的宽度与 Qml Rectangle/Text 显示的宽度不匹配 【发布时间】:2019-12-27 16:39:23 【问题描述】:

我编写了一个 qml 和 cpp 文件来验证和可视化 QFontMetrics 概念。

#include <QFontMetrics>
#include<QFontMetricsF>
#include<QDebug>
int main(int argc, char *argv[])

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

QString translation = " Sort médicament à la liste des filtres";
QString fontname = "Frobisher";
int size = 28;

QFont font(fontname,size);
QFontMetrics fm(font);
int pixelsWide = fm.width(translation);


qDebug()<<"width "<<pixelsWide;
return app.exec();

main.qml 文件

Window 

visible: true
width: 940
height: 480
title: qsTr("Hello World")

Rectangle

    color: "blue"
    width: 642
    height: 47
    Text 
        id: txt
        anchors.fill: parent
        anchors.centerIn: parent.Center
        text: qsTr(" Sort médicament à la liste des filtres")
        font.family: "Frobisher"
        font.bold: true
        font.pixelSize: 28
        elide: Text.ElideRight

    


当我运行这个程序时,QFontMetrics 提供的宽度是:694。 但是,在 qml 文件中为 Rectangle 和 Text 设置的宽度是 642,并且也设置了 elide 属性。有了这个逻辑(如 694 > 642),我应该会看到截断。但没有看到截断。

请参考qml输出

这是为什么?无法理解。

【问题讨论】:

【参考方案1】:

字体是不同的,因为在 C++ 方面,您已经确定 pointSize 为 28,但在 QML 方面,您确定 pixelSize 为 28(要了解点大小和像素大小之间的差异,请查看 this post)


TL;博士;

在 C++ 方面你使用过this constructor:

QFont::QFont(const QString &amp;family, int <b>pointSize</b> = -1, int weight = -1, bool italic = false)

您明确将 pointSize 设置为 28,但在 QML 中您将 pixelSize 设置为 28:

Text 
    // ...
    font.bold: true
    font.pixelSize: 28
    // ...

解决方法是使用字体相同的特性:

Text 
    // ...
    font.bold: true
    font.pointSize: 28
    // ...


注意:从 Qt>=5.11 开始,您应该使用 horizontalAdvance() 而不是 width(),因为后者已被弃用。

【讨论】:

以上是关于为啥 QFontMetrics 提供的宽度与 Qml Rectangle/Text 显示的宽度不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Qt 浅析QFontMetrics 获取字体宽度,高度

如何设置动态 QFont 大小?

我们如何知道字符串的宽度和高度?

将QLineEdit的宽度调整为内容(并且比预期的更短)

如何解释 QFontMetrics 结果?

QFontMetrics 给出等宽字体的奇怪结果