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中的可重用字体属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章