(我正在使用Qt 5,QtQuick 2,带有控件。)
我正在编写我的第一个QML应用程序,并希望保持模块化和相对较小的文件长度。
有些东西大批量出现,我想收集到帮助文件中,但我不确定这样做的正确方法。
到目前为止我遇到的两个例子是FontLoader
和Action
。
在我的特殊情况下,我将在整个应用程序中使用6种字体,所以我想尽早加载它们,而不必再担心它。我的问题是,我应该在哪里放FontLoader
s?
一种选择是将它们放在某个地方的main.qml
,但这对我来说感觉有些混乱。我所做的是创建了一个文件FontLoaders.qml
,其中包含:
Item {
width: 0; height: 0
FontLoader {
name: "myFont1"
source: "/fonts/myFont1.ttf"
}
FontLoader {
name: "myFont2"
source: "/fonts/myFont2.ttf"
}
// ...
}
然后,在某个地方main.qml
,我只有FontLoaders {}
。
我的另一个例子是Action
。我有一大批Action
个,我希望在应用程序范围内或多或少可见。我有一个AppMenuBar
组件,这似乎是放置Action
的一个自然的地方,但这基本上是定义菜单栏的QML文件的大小的两倍,从逻辑上讲,两者可以分开出。 (许多操作都可以通过菜单栏和应用程序中的其他按钮访问。)
“解决方案”我基本上都有用,但他们觉得我很邋((尤其是FontLoaders
),我想知道是否有一些更清洁的方法可以做到这一点,我还没想到。
答案 0 :(得分:5)
我有类似的问题。我确实看了一下Qt的一些来源,并认为你可以做到这一点:
pragma Singleton
import QtQuick 2.0
QtObject {
property FontLoader fontLatoBlackLoader: FontLoader {
name: "fontLatoBlack"
source: "qrc:/fonts/Lato-Black.ttf"
}
}
在您说的fonts.qml文件中,然后在应用程序中执行:
Label {
text: "Sample tesxt"
font.family: Fonts.fontLatoBlackLoader.name
}
您不必实例化Fonts对象。它只存在于全球范围内。
希望有所帮助。我花了几个小时自己解决这个问题,因为我有同样的邋/丑问题:))
答案 1 :(得分:2)
我希望在应用程序范围内或多或少可见
有几种方法可以解决:
1 - QML具有动态范围,这意味着如果在根组件中声明某个属性,它将在任何地方都可访问,只要它没有被具有相同名称的本地属性遮蔽,就可以有{{1}并在任何地方使用它。它甚至不需要是属性,如果您设置了ID property var something : someObject
,则可以在任何地方使用FontLoaders { id: fontLoaders }
。
2 - 您可以使用共享库并在其中使用fontLoaders
,并在您需要该对象的任何位置包含该库:
var
3 - 一旦主QML被实例化,您就可以在C ++中找到该对象并将其注册为上下文属性,使其在QML中全局可用
4 - 您可以使用C ++类创建服务器包装器作为共享数据的访问者
用code snippets in this answer解释了3和4,虽然这对你在QML中使用的C ++对象更有用,坦率地说,QML中的动态范围是最简单的方法。
到底在哪里准确地把它们放在哪里 - 最有意义的地方。如果你需要那些应用程序范围,主要组件似乎是显而易见的选择,如果你不想太多混乱,请在单独的qml文件中声明它们,并且只需在使用字体加载器时在main中实例化