QML中的可重用字体属性[重复]

Posted

技术标签:

【中文标题】QML中的可重用字体属性[重复]【英文标题】:Reusable font properties in QML [duplicate] 【发布时间】:2016-05-27 15:40:51 【问题描述】:

在 QML 中,我希望能够为简单的语义重用定义一组字体属性。例如,而不是:

Text 
  text: "This is a header"
  font  family:'Encode Sans'; weight:Font.Black; italic:false; pointSize:24 

我希望能够写作:

Text 
  text: "This is a header"
  font: headerFont

如何创建一个可以像这样分配的 font 值?


我知道我制作了一个组件,例如:

# Header.qml
Text 
  font  family:'Encode Sans'; weight:Font.Black; italic:false; pointSize:24 


# main.qml
Header  text:"This is a header" 

但是,当我想为 Label 或其他需要 font 的地方使用相同的字体设置时,这不起作用。

我也知道我可以使用this question 的答案,例如:

// style.js    
.pragma library
var header = 
  family: 'Encode Sans',
  weight: Font.Black, // is this legal?
  italic: false,
  size:   24
;
// main.qml
import "style.js" as Style

Text 
  text: "This is a header"
  font 
    family: Style.header.family
    weight: Style.header.weight
    italic: Style.header.italic
    pointSize: Style.header.size
  

虽然这确实是单一来源的值,但如图所示,它非常冗长。


我试过这个...

Font 
  id: header
  family: 'Encode Sans'
  weight: Font.Black
  italic: false
  pointSize: 24


Text 
  text: "This is a header"
  font: header

...但在Font 行上出现“无法创建元素”错误。

【问题讨论】:

大多数不平凡的 QML 难题让我请求 Qt 支持。 ***.com/questions/36848185/… ***.com/questions/36806326/… @ddriver 谢谢。我在我的问题中提到了这个选项(它在中间)并且正在寻找一个更好的答案,它适用于多种不同类型。 【参考方案1】:

This answer 正好满足我的需要。我可以使用Qt.font() 方法来创建具有我需要的属性的字体值。用全局 ID 包裹在 QtObject 中,然后我可以:

### main.qml
QtObject 
    id: theme
    property font headerFont: Qt.font(
        family: 'Encode Sans',
        weight: Font.Black,
        italic: false,
        pointSize: 24
    )


### AnyOther.qml
Text 
    text: "This is a header"
    font: theme.headerFont

【讨论】:

【参考方案2】:

嗯,这真的不是很明显的话题..我会把它作为一个答案,但它可能不是你问题的直接答案,尽管我希望它可能会有所帮助..

.pragma 是一种可行的方法,直到您不使用 qtquickcompiler 使用 QT > 5.6,.pragma 库在 Qt 5.5 上被破坏然后使用 qtquickcompiler,所以它不是解决我们的案例。

我们与 QML 字体进行了几个月的斗争,试图在我们的应用程序中获得正确、美观的字体,实际上目标是让 QML 应用程序的字体看起来与操作系统中的其他字体完全相同(我是谈论 WinXX).. 所以 QML 应用程序中的 Arial 字体看起来与任何 Windows 应用程序中的 Arial 字体完全相同。

首先我们必须从 QTRenderer 切换到 Native,因为 FreeType 渲染器在 WinXX 平台上看起来比原生字体差得多,至少这是一种让应用程序看起来更接近原生字体的方法。实际上,从这一点来看,字符的外观与操作系统中的字符相同,但是..

然后我们遇到了很多问题,字符间距错误(尤其是非英文字母)、字距调整等。

其他问题是您无法更改 QML 中的许多 QFont 属性,但是当您从 C++ 导出对象返回预构建 QFont 对象时它们可用。

我们最终得到的是遵循 C++ 代码框架:

QFont GlobalObject::createFont(const QString & family, int pixelSize, bool isBold, bool bKerning) const 
    QFont ft = QFont(family);
    ft.setFamily(family);
    ft.setBold(isBold);
    ft.setPixelSize(pixelSize);
    ft.setKerning(bKerning);

    return ft;

您可以为 ft 应用任何缓存,因此您将拥有一个按名称命名的子集,无论您认为什么合适。这工作得很好,具有适当的本机渲染,这是在 QML 应用程序中的 WinXX 上获得像素级相同外观字体的唯一方法

所以我对答案的看法(根据我的经验)是在 C++ 中处理 QFont 对象,如果您想对事物的外观进行适当的微调,而不是尝试在 QML 代码中使用它。

【讨论】:

FWIW,请参阅我接受的答案,它显示了如何使用 Qt.font() 方法直接在 QML 中创建 font 值。 问题是 QFont 本身有更多的微调选项,例如您建议的 QML 版本不提供的字距控制。我的意思是,只要您不必对这些问题进行排序,您的方法肯定会更干净,因为它是原生 QML,但是我的方法是更好地解决一些渲染错误..

以上是关于QML中的可重用字体属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

React 中的可重用文本字段

QML 可重用组件

Magnolia 中的可重用表单组件

具有嵌套元素的可重用块 - SCSS [重复]

Ext JS MVC 中的可重用操作

QML 设置字体大小写