QML:如何检索默认字体对象

QML: How to retrieve a default font object?

本文关键字:默认 字体 对象 检索 何检索 QML      更新时间:2023-10-16

我有一个QML Item,其中有一些Text字段,它们应该都有相同的字体。为了实现这一点,我引入了font型的新性质myFont。要初始化这个属性,我使用Qt.font函数,它会创建一个字体对象。但我必须指定至少一个属性(familypointSize)。

我现在的问题是:如何检索myFont属性的默认字体?如果我只创建一个Text{}项目,它已经附加了默认字体,我如何为myFont属性获得相同的字体?(同时,我使用了一个隐藏的Text字段,并为其font属性创建了一个别名,但我想要一个更好的解决方案)。

Item {
 property font myFont: Qt.font({pointSize: 10})
 Text {
  id: header
  font: myFont
  text: "My Header"
 }
 Text {
  id: subject
  font: myFont
  text: "My Subject"
 }
 Text {
  id: message
  font: myFont
  text: "Some meassage!"
 }
}

现在,我已经深入研究了Qt源代码。事实证明,Qt使用了一个注册的私有TextSingleton,它被定义为(Qt 5.6):

pragma Singleton
import QtQuick 2.2
Text {
}

初始化各种qml控件的字体属性:

font: TextSingleton.font

进一步挖掘C++代码可以发现,对于Text项,font属性是默认初始化的QFont,它给出了从QGuiApplication::font()检索到的QFont对象。

我认为解决这个问题的正确方法是使用需要使用的字体创建自己的对象类型。

在下面的示例中,新对象将是MyText.qml。我不知道你的全部代码,但我想你在问题中发布的代表有一个ListView

MyText.qml

import QtQuick 2.0
Text {
    font: Qt.font({pointSize: 10})
}

main.qml

import QtQuick 2.5
import QtQuick.Window 2.2
Window {
    visible: true
    ListModel {
        id: myModel
        ListElement {
            header: "header xxx"
            subject: "subject xxx"
            message: "message xxx"
        }
        ListElement {
            header: "header yyy"
            subject: "subject yyy"
            message: "message yyy"
        }
        ListElement {
            header: "header zzz"
            subject: "subject zzz"
            message: "message zzz"
        }
    }
    ListView {
        anchors.fill: parent
        model: myModel
        delegate: Item {
            width: 300; height: 80
            Column {
                MyText {
                    id: myheader
                    text: header  + " - family: " + font.family  + " size: " + font.pointSize
                }
                MyText {
                    id: mysubject
                    text: subject  + " - family: " + font.family + " size: " + font.pointSize
                }
                MyText {
                    id: mymessage
                    text: message  + " - family: " + font.family + " size: " + font.pointSize
                }
            }
        }
    }
}

正如我在这里提到的,FontMetrics是可行的,因为它是可配置的,不需要使用Qt.font()。您可以在父项或SIngleton类型中声明它,并且您可以将属性绑定到它。

这里有一个的例子

Item {
id: root
FontMetrics {
    id: fontMetrics
    font.family: "Arial"
    font.pixelSize: 24
}
property alias font: fontMetrics.font
Text { font: root.font }
Text { font: root.font }
}

您可以使用Qt.application.font访问QML中的默认字体。

您可以使用在C++中获取并设置此字体

QFont font = QApplication::font();
font.setPointSize(12); //make various other changes or get a completely new QFont
QApplication::setFont(font);