【Qt】QMLにおけるJavaScriptの使い方の詳細
6024 ワード
JavaScriptに詳しいのはすべてNetscape会社を知っているはずです.一代のおごり者は倒れましたが、後代の人に最も貴重な製品と経験を残しました.インターネットの発展史において重要な地位を占めています.QMLはJavaScriptに対する拡張であり、JSホスト環境を提供しています.使い方は似ていますが、ブラウザ/サーバー側に提供されているJSホスト環境(Node.jsなど)とは異なるところがあります.
1、QMLファイルのJS表現
初期化時のプロパティバインディング――
独立したJSファイルでQML論理部分を実現する.
JSファイルに別のJSファイルを導入します.
1、QMLファイルのJS表現
初期化時のプロパティバインディング――
// Property.qml
import QtQuick 2.0
Rectangle {
id: colorButton
width: 360; height: 360
color: mouseArea.pressed ? "steelblue" : "lightsteelblue"
MouseArea {
id: mouseArea
anchors.fill: parent
}
}
Qt.binding()を使用して、属性バインディングを完了します.// Property2.qml
import QtQuick 2.0
Rectangle {
id: colorbutton
width: 360; height: 360
color: "yellow"
MouseArea {
id: mouseArea
anchors.fill: parent
}
Component.onCompleted: {
color = Qt.binding(function() { return mouseArea.pressed ? "red" : "green" })
}
}
信号処理におけるJS表現// Handler.qml
import QtQuick 2.0
Rectangle {
id: button
width: 200; height: 100; color: "lightblue"
MouseArea {
id: mouseArea
anchors.fill: parent
onPressed: label.text = "I am Pressed!"
onReleased: label.text = "Click Me!"
}
Text {
id: label
anchors.centerIn: parent
text: "Press Me!"
}
}
QMLファイル内の関数のJS表現――// InlineFunction.qml
import QtQuick 2.0
Item {
function factorial(a) {
a = parseInt(a);
if (a <= 0)
return 1;
else
return a * factorial(a - 1);
}
MouseArea {
anchors.fill: parent
onClicked: console.log(factorial(5))
}
}
JSファイル内の関数のJS表現――// factorial.js
function factorial(a) {
a = parseInt(a);
if (a <= 0)
return 1;
else
return a * factorial(a - 1);
}
// ExternalFunction.qml
import QtQuick 2.0
import "factorial.js" as MathFunctions
Item {
MouseArea {
anchors.fill: parent
onClicked: console.log(MathFunctions.factorial(10))
}
}
connect()を使って信号を処理します.// Connecting.qml
import QtQuick 2.0
import "script.js" as MyScript
Item {
id: item
width: 360; height: 360
MouseArea {
id: mouseArea
anchors.fill: parent
}
Component.onCompleted: {
mouseArea.clicked.connect(MyScript.jsFunction)
}
}
// script.js
function jsFunction() {
console.log("Called JavaScript function!")
}
Component.onComppleted付加信号を使用します.// Startup.qml
import QtQuick 2.0
Rectangle {
function startupFunction() {
console.log("startFunction called")
}
Component.onCompleted: startupFunction()
}
2、QMLファイル中のJSリソース独立したJSファイルでQML論理部分を実現する.
// MyButton.qml
import QtQuick 2.0
import "my_button_impl.js" as Logic
Rectangle {
id: rect
width: 360
height: 360
color: "red"
MouseArea {
id: mousearea
anchors.fill: parent
onClicked: Logic.onClicked(rect)
}
}
// my_button_impl.js
var clickCount = 0;
function onClicked(btn) {
clickCount += 1;
if ((clickCount % 5) == 0) {
btn.color = Qt.rgba(1,0,0,1);
} else {
btn.color = Qt.rgba(0,1,0,1);
}
}
JSファイルは共有ライブラリと定義されています.// Calculator.qml
import QtQuick 2.0
import "factorial.js" as FactorialCalculator
Text {
width: 500
height: 100
property int input: 10
text: "The factorial of " + input + " is: " + FactorialCalculator.factorial(input)
}
// factorial.js
.pragma library
var factorialCount = 0;
function factorial(a) {
a = parseInt(a);
if (a > 0)
return a * factorial(a - 1);
factorialCount += 1;
return 1;
}
function factorialCallCount() {
return factorialCount;
}
Worket ScriptというQMLタイプを使います.// MyWorkerScript.qml
import QtQuick 2.0
Rectangle {
width: 300; height: 300
Text {
id: myText
text: 'Click anywhere'
}
WorkerScript {
id: myWorker
source: "worker_script.js"
onMessage: myText.text = messageObject.reply
}
MouseArea {
anchors.fill: parent
onClicked: myWorker.sendMessage({ 'x': mouse.x, 'y': mouse.y })
}
}
// worker_script.js
WorkerScript.onMessage = function(message) {
WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
}
3、JSファイルの導入JSファイルに別のJSファイルを導入します.
.import “filename.js” as Qualifier
JSファイルにQMLモジュールを導入する..import TypeNamespace MajorVersion.MinorVersion as Qualifier
JSファイルではQt.include()を使用して別のJSファイルを導入します.// Including.qml
import QtQuick 2.0
import "script2.js" as MyScript
Item {
width: 360; height: 360
MouseArea {
anchors.fill: parent
onClicked: {
MyScript.showCalculations(10)
console.log("Call factorial() from QML:", MyScript.factorial(10))
}
}
}
// script2.js
Qt.include("factorial2.js")
function showCalculations(value) {
console.log("Call factorial() from script2.js:", factorial(value));
}
// factorial2.js
function factorial(a) {
a = parseInt(a);
if (a <= 0)
return 1;
else
return a * factorial(a - 1);
}