【问题标题】:QML: How to retrieve a default font object?QML:如何检索默认字体对象?
【发布时间】:2016-04-19 08:35:49
【问题描述】:

我有一个 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!"
 }
}

【问题讨论】:

  • 为什么不使用property font myFont: header.font?并从header 中删除默认的font 绑定?
  • 实际上 Text 字段位于 ListView 委托中,所以这是我的第一次尝试,但没有奏效(或者我不知道如何)。
  • 您应该使用您需要使用的字体创建自己的对象类型(即声明TextMyText)。然后使用MyText 而不是Text
  • 这应该如何帮助从外部设置一个通用字体到列表视图委托?
  • 请看我的回答。

标签: c++ qt qml


【解决方案1】:

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

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

MyText.qml

import QtQuick 2.0

Text {
    font: Qt.font({pointSize: 10})
}

ma​​in.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 请根据您的要求更新您的问题。可能,您需要的是绑定或一些信号/插槽,以便在必要时更新字体。
【解决方案2】:

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

pragma Singleton
import QtQuick 2.2
Text {
}

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

font: TextSingleton.font

深入研究 C++ 代码会发现,对于 Text 项,font 属性是默认初始化的 QFont,它提供从 QGuiApplication::font() 检索的 QFont 对象。

【讨论】:

    【解决方案3】:

    正如我提到的here,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 }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多