在哪里放Qt QML非可视应用程序组件

时间:2014-12-29 16:59:42

标签: qt qml qt-quick

(我正在使用Qt 5,QtQuick 2,带有控件。)

我正在编写我的第一个QML应用程序,并希望保持模块化和相对较小的文件长度。

有些东西大批量出现,我想收集到帮助文件中,但我不确定这样做的正确方法。

到目前为止我遇到的两个例子是FontLoaderAction

在我的特殊情况下,我将在整个应用程序中使用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),我想知道是否有一些更清洁的方法可以做到这一点,我还没想到。

2 个答案:

答案 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中实例化