回答
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. 從QML到C++插槽的信號無法找到QML信號
- 3. QML從信號
- 4. 無法從Qt捕獲發送到QML的信號C++
- 5. 如何從python程序發送信號?
- 6. 如何從nodejs發送POSIX信號
- 7. 如何從代表發送信號
- 8. 如何將信號發送到PCI卡?
- 9. 如何發送信號到套接字?
- 10. 如何發送信號?
- 11. 如何發送USR2信號?
- 12. 如何發送信號到孩子的孩子從父母收到信號後
- 13. 如何從應用程序向PyQtWebkitView javascript發送信號?
- 14. qml信號連接到Qt
- 15. Qt:C++信號到qml連接
- 16. 發送信號從C到Java
- 17. 從c#發送midi信號到ableton
- 18. 從pthread發送信號到QObject
- 19. 從JVM發送POSIX信號
- 20. QML TextInput信號
- 21. pthread_kill()不發送信號到
- 22. 發送信號到進程
- 23. fork和信號:如何從父進程發送信號到特定子進程
- 24. 如何發送和陷阱發送到PID的信號,用C
- 25. 發送信息從JavaScript到php文件
- 26. Facebook從javascript發送信息到頁面
- 27. 如何將信號從arduino發送到MATLAB?
- 28. 如何將信號從QDialog發送到QMainWindow類
- 29. 如何在JNI中將事件/信號從C發送到Java
- 30. QML C++信號&槽
我同意。好的解決方案 – 2013-10-04 06:16:19