通过在 QML 中调用导入的 javascript 函数来设置全局属性

Posted

技术标签:

【中文标题】通过在 QML 中调用导入的 javascript 函数来设置全局属性【英文标题】:Setting global properties by calling imported javascript functions in QML 【发布时间】:2020-08-20 18:02:32 【问题描述】:

我将Universal style 用于我的QtQuick 应用程序,我想提供一个ColorDialog 来调整强调色。

我有这样的事情:

ColorDialog 
    id: accChooser
    title: "Please choose a color"
        onAccepted: 
            setGlobalAccentColor(accChooser.color) 
        

*请注意,我不能简单地将Universal.accent=... 写在子项中,因为它对父项没有影响。请参阅this。

还有这个功能:

function setGlobalAccentColor(accentColor)
    Universal.accent = accentColor

当函数 setGlobalAccentColor 定义在与 accChooser 相同的 QML 文件中时,它可以工作,但是如果我在外部 JS 文件中定义该函数(比如 helpers.js)并通过以下方式导入它:

import "helpers.js" as JSHelpers

并以这种方式使用它:

ColorDialog
...
    JSHelpers.setGlobalAccentColor(colorDialog.color)
...

它不起作用。应用程序的输出中没有特定的错误或警告消息。

谢谢。

【问题讨论】:

【参考方案1】:

可能需要在javascript文件中导入通用样式。

文档universal style 如下所述(查看依赖部分)

必须单独导入通用样式才能访问 通用样式特有的属性

您可以在您的 javascript (helpers.js) 文件中尝试如下所述的importing。

.import QtQuick.Controls.Universal 2.12 as JsUniversal

然后尝试访问(例如:JsUniversal.accent..)。

【讨论】:

嗨@Paven。遗憾的是它不起作用。在您提供的link 中还提到A script without imports will inherit imports from the QML document which imported it 是为了向后兼容。所以JS 文件中的另一个导入不起作用.【参考方案2】:

请注意,我不能简单地将 Universal.accent=... 写在子项中,因为它对父项没有影响。请参阅此内容。

虽然将其设置为子级不会影响您的整个应用程序,但您可以直接将其设置为整个窗口。

Window.window.Universal.accent = accentColor;

Universal 是一个attached object,您可以通过<object>.<AttachingType> 将其附加到任意对象,而不仅仅是当前对象。 我们通过另一个附加属性访问窗口,将其附加到父窗口:Window.window

【讨论】:

当我在外部 JS 函数中使用它时,我得到了 ReferenceError: Window is not defined 并在添加 .import QtQuick.Window 2.14 as Window:TypeError: Cannot read property 'Universal' of undefined 之后。

以上是关于通过在 QML 中调用导入的 javascript 函数来设置全局属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 QML 文件调用 QML 文件中定义的 Javascript 函数?

在 QML Javascript 中调用 QCursor::setPos

将 Qt 函数导入 QML 文件?

从 QML ListView 委托调用 JavaScript 对象方法

Qt 5.12 QML,在javascript中通过var选择QML对象

如何使用 QML QtWebView 调用 C++?