如何将信号从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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2018-04-05 vNS12 MySQL Performance