簡體   English   中英

為什么 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 文件中為 Rectangle 和 Text 設置的寬度是 642,並且也設置了 elide 屬性。 有了這個邏輯(如 694 > 642),我應該會看到截斷。 但沒有看到截斷。

請參考 qml 輸出

為什么是這樣? 無法理解。

字體是不同的,因為在 C++ 方面你已經確定了 pointSize 是 28 但在 QML 方面你已經確定了 pixelSize 是 28(要知道點大小和像素大小之間的區別,請查看這篇文章


TL; 博士;

在 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()因為后者已被棄用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM