zoukankan      html  css  js  c++  java
  • 如何将信号从javascript发射到qml

    如何将信号从javascript发射到qml

    https://stackoverflow.com/questions/8696448/how-to-emit-signals-from-javascript-to-qml

    我想从javascript文件中发出信号并在qml文件中接收它(以查找耗时的操作何时完成)。

    -------------------------------------

    亚历克斯(Alex)的野蛮拉贾(Raja)的解决方案都没有真正回答这个问题。Alex的工作包括直接从javascript代码中调用QML slot方法,而Raja的工作在于从Javascript代码中设置QML对象的属性值。两种方法都否定了信号/时隙机制的主要优点,即信令对象不需要知道时隙。

    博客文章(不是我的文章)中描述了一种更接近信号/插槽机制的精神的方法它在javascript文件中包含创建QML对象(通过Qt.createQmlObject()函数),该对象的唯一功能是包含javascript的对象信号。通过调用内部QML对象信号(例如internalQmlObject.signalName()从javascript发出信号,并且javascript对象信号可以通过QML connect通过常规机制通过QML连接到QML插槽javascriptObject.internalQmlObject.signalName.connect(receiver.slotName)

    下面是从博客文章改编而成的示例:

    javascript_object.js:

    var internalQmlObject = Qt.createQmlObject('import QtQuick 2.0; QtObject { signal someSignal(int value) }', Qt.application, 'InternalQmlObject');
    
    function doSomething() {
        internalQmlObject.someSignal(42);
    }
    

    test.qml:

    import QtQuick 2.0
    import 'javascript_object.js' as JavascriptObject
    
    Rectangle {
    
        Rectangle {
            id: someComponent
    
            function someSlot(v) {
                console.log("Signal received " + v);
            }
        }
    
        Component.onCompleted: {
            JavascriptObject.internalQmlObject.someSignal.connect(someComponent.someSlot);
            JavascriptObject.doSomething();
        }
    }
    

    在执行时,它提供以下内容:

    % qmlscene test.qml
    Signal received 42

    -------------------------------------

    我为自己找到了解决方案。

    qml-file中:创建元素Item(我的loginItem),其中包含充当插槽角色的功能。例如(我需要知道何时处理登录事件):

    import "scripts/auth.js" as Auth
    ...
    Item {
       id: loginItem
    
       // Send himself to javascript module named Auth
       Component.onCompleted: {
          Auth.setLoginItem(loginItem);
       }
    
       // "Slot" function
       function logged() {
          console.debug("Login successfully");
          // Do something
          ...
       }
    }
    

    js-file中:为loginItem创建接收器并使用它。

    var loginItem;
    
    function setLoginItem(tempLoginItem) {
        loginItem = tempLoginItem;
    }
    
    ...
       // Emit "signal"
       loginItem.logged();
    ...
    -------------------------------------

    嗯,从真实的JS文件中调用信号非常困难。但是,还有一个更好的选择,恕我直言,我自己使用了它。创建自己的示例。

    MyClass.qml

    import QtQuick 2.0
    
    QtObject
    {
        property var myVariable
        function myFunction() { console.log("emitting signal"); mySignal() }
        signal mySignal
    }
    

    这样,您可以轻松实现所需的封装。您甚至可以很好地连接到对象。

    然后,您可以使用它进行任何操作:从中创建单例,创建全局对象,实例化它。

    ================= End

  • 相关阅读:
    如何降低微服务测试成本?我的经验之谈
    Serverless 在 SaaS 领域的最佳实践
    技术干货 | “选图预览并上传”的场景如何解?全网最全方案汇总来了
    SRE技术保障平台-盯屏中心TAC: 混合云一站式告警运维平台
    DTCC 2020 | 阿里云王涛:阿里巴巴电商数据库上云实践
    中值滤波算法 C
    python logger.debug_python中的logger模块讲解
    唯一值
    接触jeecgBoot低代码开发
    php数字操作
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12636882.html
Copyright © 2011-2022 走看看