QML:如何获取默认字体对象?

3
我有一个包含一些文本字段的QML Item,它们应该具有相同的字体。为了实现这个目标,我引入了一个新的属性myFont,类型为font。为了初始化此属性,我使用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!"
 }
}

为什么不使用 property font myFont: header.font?并从 header 中删除默认的 font 绑定? - bipll
实际上,文本字段位于ListView委托内部,因此这是我的第一次尝试,但它没有起作用(或者我无法弄清楚如何操作)。 - jonjonas68
你应该创建自己的对象类型(例如 MyText 声明一个 Text),并使用所需的字体。然后使用 MyText 代替 Text - Tarod
如何从外部设置一个通用字体到列表视图的代理中? - jonjonas68
请查看我的答案。 - Tarod
4个回答

5

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

pragma Singleton
import QtQuick 2.2
Text {
}

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

font: TextSingleton.font

深入了解 C++ 代码可发现,在 Text 项中,font 属性是一个默认初始化的 QFont,它会给出从 QGuiApplication::font() 中获取到的 QFont 对象。

4

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

在以下示例中,新对象将是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
                }
            }
        }
    }
}

这个方法可以实现,但是不够灵活,这也是我想声明一个字体属性的主要原因。我的ListView在一个独立的组件中,可以放置在一个表单上,我希望在那里将字体设置为所有的listview项。MainForm { MyComponentWithAListView { font: Qt.font({family:"Arial", pointSize: 12}) } } - jonjonas68
@jonjonas68 请更新您的问题并说明您的要求。可能您需要绑定或一些信号/槽来在必要时更新字体。 - Tarod

0

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

您可以使用以下代码在 C++ 中获取和设置此字体:

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

0
正如我在这里提到的那样,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 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接