如何从 javascript 向 qml 发出信号
我想从 javascript 文件发出信号并在 qml 文件中接收它(以查找耗时的操作何时完成)。
我该怎么做呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想从 javascript 文件发出信号并在 qml 文件中接收它(以查找耗时的操作何时完成)。
我该怎么做呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
亚历克斯和拉贾的解决方案都没有真正回答这个问题。 Alex 的方法是直接从 javascript 代码调用 QML slot 方法,而 Raja 的方法是从 Javascript 代码设置 QML 对象的属性值。这两种方法都否定了信号/时隙机制的主要优点,即信令对象不需要知道时隙。
博客文章(不是我的)。它包括在 javascript 文件中创建一个 QML 对象(通过 Qt.createQmlObject() 函数),该对象的唯一功能是包含 javascript 的对象信号。信号是通过调用内部 QML 对象信号(例如
internalQmlObject.signalName()
)从 javascript 发出的,并且 javascript 对象信号可以使用通常的connectjavascriptObject.internalQmlObject.signalName.connect(receiver.slotName)
的 code> 机制。下面是根据博客文章改编的示例:
javascript_object.js:
test.qml:
执行时会给出以下内容:
Neither Alex's nore Raja's solutions really answer the question. Alex's consists in calling directly from the javascript code the QML slot method, and Raja's consist in setting the value of a property of a QML object from the Javascript code. Both approaches negate the main advantage of the signal/slot mechanism which is that the signalling object does not need to know of the slot.
An approach closer to the spirit of the signal/slot mechanism is described in this blog post (not mine). It consists, within the javascript file, of creating a QML object (via the
Qt.createQmlObject()
function) the sole function of which is to contain the javascript's object signals. Signals are emitted from javascript through calling the internal QML objects signal (e.g.internalQmlObject.signalName()
), and the javascript object signal can be connected in QML to QML slots with the usualconnect
mechanism viajavascriptObject.internalQmlObject.signalName.connect(receiver.slotName)
.An example adapted from the blog post is below:
javascript_object.js:
test.qml:
On execution it gives the following:
谢谢你,@RajaVarma。
我为自己找到了解决方案。
在qml-file中:创建元素Item(我的loginItem),其中包含扮演插槽角色的函数。
例如(我需要知道何时处理登录事件):
在js文件中:为loginItem创建接收器并使用它。
Thank you, @RajaVarma.
I found solution for myself.
In qml-file: create element Item (my loginItem) which contains function that plays the role of slot.
For example (I need to know when handle login event):
In js-file: create receiver for loginItem and use it.
嗯,从真实的 JS 文件中调用信号是非常 hacky 的。但有一个更好的选择,恕我直言,我自己用过它。创建您自己的类。
MyClass.qml
这样就可以轻松实现所需的封装。您甚至可以很好地连接到该对象。
然后你可以用它做任何你想做的事:从中创建一个单例,创建一个全局对象,实例化它。
Well, it's very hacky to call signals from a real JS file. But there's a better option, IMHO, used it myself instead. Create your own class.
MyClass.qml
This way you can easily achieve the needed encapsulation. And you can even nicely connect to the object.
Then you can do whatever you want with it: create a singleton from it, create a global object, instantiate it.