为什么 QFontMetrics 提供的宽度与 Qml Rectangle/ Text 显示的宽度不匹配
Why is there a mismatch in width provided by QFontMetrics and width shown by 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 文件中为矩形和文本设置的宽度为 642,并且也设置了 elide 属性。按照这个逻辑(如 694 > 642),我应该看到 t运行cation。但是没有看到t运行阳离子
请参考qml输出
这是为什么?无法理解。
字体不同,因为在 C++ 端你已经确定 pointSize 是 28 但在 QML 端你已经确定 pixelSize 是 28(要知道点大小和像素大小之间的差异检查 this post)
TL;博士;
在 C++ 端你使用了 this constructor:
QFont::QFont(const QString &family, int <b>pointSize</b> = -1, int weight = -1, bool italic = false)
您明确将 pointSize 设置为 28,但在 QML 中您将 pixelSize 设置为 28:
Text {
// ...
font.bold: true
<b>font.pixelSize</b>: 28
// ...
解决方法是使用相同特性的字体:
Text {
// ...
font.bold: true
<b>font.pointSize</b>: 28
// ...
注意: 从 Qt>=5.11 开始,您应该使用 horizontalAdvance()
instead of width()
,因为后者已被弃用。
我已经编写了一个 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 文件中为矩形和文本设置的宽度为 642,并且也设置了 elide 属性。按照这个逻辑(如 694 > 642),我应该看到 t运行cation。但是没有看到t运行阳离子
请参考qml输出
这是为什么?无法理解。
字体不同,因为在 C++ 端你已经确定 pointSize 是 28 但在 QML 端你已经确定 pixelSize 是 28(要知道点大小和像素大小之间的差异检查 this post)
TL;博士;
在 C++ 端你使用了 this constructor:
QFont::QFont(const QString &family, int <b>pointSize</b> = -1, int weight = -1, bool italic = false)
您明确将 pointSize 设置为 28,但在 QML 中您将 pixelSize 设置为 28:
Text {
// ...
font.bold: true
<b>font.pixelSize</b>: 28
// ...
解决方法是使用相同特性的字体:
Text {
// ...
font.bold: true
<b>font.pointSize</b>: 28
// ...
注意: 从 Qt>=5.11 开始,您应该使用 horizontalAdvance()
instead of width()
,因为后者已被弃用。