Почему существует несоответствие ширины, предоставленной QFontMetrics, и ширины, показанной Qml Rectangle/ Text

Я написал файлы 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 (чтобы узнать разницу между размером точки и размером пикселя, проверьте этот пост)


TL; DR;

На стороне C++ вы использовали этот конструктор:

QFont::QFont(const QString &family, int pointSize = -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() поскольку последний устарел.

Другие вопросы по тегам