回答
Alex的nore Raja的解决方案都没有真正回答这个问题。 Alex's直接从javascript代码调用QML插槽方法,Raja的功能在于通过Javascript代码设置QML对象的属性值。两种方法都不利于信号/时隙机制的主要优点,即信令对象不需要知道时隙。
这个blog post(不是我的)描述了一种更接近信号/插槽机制精神的方法。它包含在javascript文件中创建一个QML对象(通过Qt.createQmlObject()
函数),其唯一功能是包含javascript的对象信号。通过调用内部QML对象信号(例如internalQmlObject.signalName()
)从javascript发出信号,并且可以通过javascriptObject.internalQmlObject.signalName.connect(receiver.slotName)
通过通常的connect
机制将javascript对象信号以QML连接到QML插槽。
适于从博客文章的一个例子是下面:
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是一种UI声明性语言,广泛用于UI开发。 QML本身不能编写太多或复杂的功能。但是,您可以在单个文件中同时使用JavaScript和QML。如果你想停止一个动画,例如,加载gif动画,在耗费时间的过程之后,只需考虑下面的代码行即可。
loadingAnimation.running = false;
上述代码行可以从JavaScript文件本身调用。如果您仍然认为此功能不足,请告诉我们您的使用案例。
谢谢@RajaVarma。
我为自己找到了解决方案。
qml-file:创建元素Item(my 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文件:为loginItem创建接收器并使用它。
var loginItem;
function setLoginItem(tempLoginItem) {
loginItem = tempLoginItem;
}
...
// Emit "signal"
loginItem.logged();
...
与问题无关,但它被“登录”而不是“登录”;) – 2012-01-03 11:25:48
我很抱歉我的英语。我保证本月会参加语言课程。 – 2012-01-03 17:22:11
嗯,从一个真正的JS文件中调用信号非常困难。但有一个更好的选择,恕我直言,自己使用它。创建你自己的班级。
MyClass。qml
import QtQuick 2.0
QtObject
{
property var myVariable
function myFunction() { console.log("emitting signal"); mySignal() }
signal mySignal
}
这样就可以轻松实现所需的封装。你甚至可以很好地连接到对象。
然后你可以随心所欲地做任何事情:从它创建一个单例,创建一个全局对象,实例化它。
- 1. QML从信号
- 2. 无法从Qt捕获发送到QML的信号C++
- 3. 如何从代表发送信号
- 4. 如何从nodejs发送POSIX信号
- 5. 如何从python程序发送信号?
- 6. 如何将信号发送到PCI卡?
- 7. 如何发送信号?
- 8. 如何发送信号到孩子的孩子从父母收到信号后
- 9. qml信号连接到Qt
- 10. Qt:C++信号到qml连接
- 11. 从c#发送midi信号到ableton
- 12. QML TextInput信号
- 13. 从JVM发送POSIX信号
- 14. pthread_kill()不发送信号到
- 15. 发送信号到进程
- 16. fork和信号:如何从父进程发送信号到特定子进程
- 17. 如何发送和陷阱发送到PID的信号,用C
- 18. Facebook从javascript发送信息到页面
- 19. 发送信息从JavaScript到php文件
- 20. 如何将信号从arduino发送到MATLAB?
- 21. 如何在JNI中将事件/信号从C发送到Java
- 22. 如何将信号从QDialog发送到QMainWindow类
- 23. QML信号连接
- 24. 如何断开方法在QML信号
- 25. 如何捕捉QML中的信号?
- 26. android短信发送到收到号码
- 27. 如何向Testcontainers发送信号?
- 28. 如何向线程发送无信号?
- 29. 如何发送DTMF信号的Symbian S60
- 30. 如何从JavaScript发送数据到PHP
我同意。好的解决方案 – 2013-10-04 06:16:19