从JavaScript调用Qml函数

从JavaScript调用Qml函数,javascript,html,function,qml,Javascript,Html,Function,Qml,我正在使用Qt开发一个应用程序,我有一个地方卡住了,我想在一个特定的事件上从JavaScript调用QML函数,这个事件是从我的HTML中触发的 我尝试过以下方法: app.html <html> <head><title>Myapp</title></head> <script src="testjs.js" type="text/javascript"></script> <body bgcolor="

我正在使用Qt开发一个应用程序,我有一个地方卡住了,我想在一个特定的事件上从JavaScript调用QML函数,这个事件是从我的HTML中触发的

我尝试过以下方法:

app.html

<html>
<head><title>Myapp</title></head>
<script src="testjs.js" type="text/javascript"></script>
<body bgcolor="orange">
<p id="demo" onclick="myFunction1()">Click me to change my text color.</p>
</body>
</html>
main.qml

import 'testjs.js' as JavascriptObject


ApplicationWindow {
    id: someComponent
    visible: true
    x: initialX
    y: initialY
    width: initialWidth
    height: initialHeight
    title: webView.title

    WebView {
        id: webView
        anchors.fill: parent
        url: initialUrl
    }
    function someSlot(v) {
        console.log("Signal received " + v);
    }
    Component.onCompleted: {
        JavascriptObject.myFunction1(41);
     }
}
在应用程序启动时,调用
testjs.js
中的
myFunction1()
,并调用我的QML中的
someSlot
函数,但不显示警报。当从HTML页面调用
myFunction1()
函数时,只显示
alert
,而不调用
someSlot
函数。

您不能在QML中使用
alert()
,因为它没有映射。您有两种解决方案:

  • 使用控制台日志
  • 使用QML中实例化的
    BoxDialog
    ,并从JS启动它

  • 您可能想使用Qt的网络频道。它用于使用WebSocket在托管HTML内容和外部资源之间进行通信。有关更多信息,请参见此:


    调用Qml函数是什么意思?是否要在类的某个实例上调用方法?只需给该类一个
    id
    ,然后作为
    id.method\u name
    调用该方法。文档中包含大量示例。@skypjack我已修改了我的问题。你能帮忙吗。
    app.html
    毫无意义。应用程序是通过命令式JavaScript或声明性绑定操作的qml文件。就这样。
    import 'testjs.js' as JavascriptObject
    
    
    ApplicationWindow {
        id: someComponent
        visible: true
        x: initialX
        y: initialY
        width: initialWidth
        height: initialHeight
        title: webView.title
    
        WebView {
            id: webView
            anchors.fill: parent
            url: initialUrl
        }
        function someSlot(v) {
            console.log("Signal received " + v);
        }
        Component.onCompleted: {
            JavascriptObject.myFunction1(41);
         }
    }