【问题标题】:Can call JavaScript function from Keys.onPressed handler, but not from Shortcuts onActivated handler. Why?可以从 Keys.onPressed 处理程序调用 JavaScript 函数,但不能从 Shortcuts onActivated 处理程序调用。为什么?
【发布时间】:2018-12-17 23:56:51
【问题描述】:

这是我的代码中的一个例外:

Keys.onPressed: {
    if ((event.modifiers & Qt.AltModifier) && (event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_Plus) {
        zoom(true, false);
    }
    if ((event.modifiers & Qt.AltModifier) && (event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_Minus) {
        zoom(false, false);
    }
}

Shortcut {
    id: zoomInX
    sequence: StandardKey.ZoomIn
    onActivated: {
        zoom(true, true);
    }
}

Shortcut {
    id: zoomOutX
    sequence: StandardKey.ZoomOut
    onActivated: {
        zoom(true, false);
    }
}

function zoom(zoomIn, zoomX) {
    ...
}

zoom 函数可以从 Keys.onPressed 代码中很好地调用。

但是当从快捷方式的onActivated 代码调用zoom 函数时,我收到以下消息:

... W: unknown: ... ReferenceError: zoom is not defined

这是为什么?我该如何解决?

我原以为缩放功能可用于 Keys 项目,它也可用于 Shortcut 项目,并且通过闭包也可用于 onActivated 代码。

来自文档:

在 QML 中,组件实例将它们的组件范围连接在一起 形成范围层次结构。组件实例可以直接访问 其祖先的组件范围。

http://doc.qt.io/archives/qt-4.8/qdeclarativescope.html

【问题讨论】:

  • 显然,如果我写了ancestItemName.zoom,它就可以工作。我仍然不确定为什么我需要这样做。 QML 是否自动将函数设置为定义它们的 QML 对象的 JavaScript 表示的属性?
  • 是的,QML 会自动将函数设置为它所定义的 QML 对象的一部分

标签: qt qml


【解决方案1】:

正如您所指出的,您必须使用祖先的 id 来标识函数,如果在祖先的范围内调用函数,则可以省略 id。这些是必要的,因为每个项目都可以定义具有相同名称的功能。

【讨论】:

  • 在 JavaScript 中,这将通过阴影来解决。我在 QML 文档中发现,在 QML 项中声明的 JavaScript 函数实际上保存为这些项上的方法:doc.qt.io/qt-5/…。这解决了我的困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多