• 如何将信号从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

  • 相关阅读:
    Azure DevOps上使用git push --force遇到的问题
    Redis常用的一些基本命令
    [Vue warn]: Error in v-on handler: "TypeError: this.onConfirm(...).then is not a function"
    政采云:数据可视化探索之SpreadJS 表格控件
    用Java写一个折半查找
    springboot 集成hibernate 多数据源链接
    java 自定义注解
    幻读:听说有人认为我是被MVCC干掉的
    懵了!女朋友突然问我MVCC实现原理
    不会MySQL索引,面试官让回家等通知!
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12636882.html
Copyright © 2020-2023  润新知