Почему существует несоответствие ширины, предоставленной 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()
поскольку последний устарел.