2012-07-11 24 views
7

मैं Q12 पर आधारित सी ++ एप्लिकेशन बना रहा हूं।QML के भीतर जावास्क्रिप्ट कार्रवाई में देरी कैसे करें?

यह आसान बनाने के लिए:

// My JS file linked to the main QML window 
[...] 
function actionOnButtonClicked() 
{ 
    var x = 0; 
    var y = 0; 
    for(var i = 0; i < 3; i++) 
    { 
     createObject(x, y); 
     x = x + 10; 
     y = y + 10; 
    } 
} 

आप के रूप में:

अपने मुख्य QML फ़ाइल में, मैं एक बटन (आयत) JavaScript फ़ंक्शन (एक बाहरी जे एस फ़ाइल में परिभाषित) बुला जब क्लिक किया है देख सकते हैं, इस समारोह में, मैं n (= यहाँ 3) बार गतिशील बनाने के लिए एक और जे एस फ़ंक्शन को कॉल कई QML दृश्य में जोड़ने के लिए वस्तुओं:

function createObject(xPosition, yPosition) 
{ 
    component = Qt.createComponent("Symbol.qml"); 
    component.createObject(windowApp, {"x": xPosition, "y": yPosition}); 
} 

यह ठीक काम कर रहा है। लेकिन बनाई गई वस्तु (प्रतीक) (1sec चारों ओर।) एक अनुवाद एनीमेशन के साथ windowApp में प्रकट होता है, और मैं एक दूसरे को बनाने से पहले पूरा करने के लिए पहली वस्तु का एनीमेशन के लिए इंतजार करना चाहते हैं ...

हम के रूप में Q12 में setTimeOut() जावास्क्रिप्ट फ़ंक्शन का उपयोग नहीं कर सकता, मुझे आश्चर्य है कि मैं इसे कैसे प्राप्त कर सकता हूं। मैं नहीं देखता कि मैं क्यूएमएल टाइमर ऑब्जेक्ट या यहां तक ​​कि पॉज़एनीमेशन का उपयोग कैसे कर सकता हूं ...

क्या कोई जानता है कि 2 क्यूएमएल जावास्क्रिप्ट ऑपरेशंस के बीच देरी कैसे जोड़नी है?

उत्तर

0

आप शायद ऐसा कर सकते हैं ताकि आप केवल अपने बटन क्रिया से एक "प्रतीक" बना सकें और नई वस्तु में कुछ ईवेंट पर एक नया प्रतीक ट्रिगर कर सकें। शायद एनीमेशन समाप्त होने वाली घटना को ट्रिगर करता है जिसका आप उपयोग कर सकते हैं?

+0

हाय, मदद के लिए धन्यवाद। वास्तव में मैं अंत में एक [scriptAction] (http://doc-snapshot.qt-project.org/4.8/qml-scriptaction.html) डालने से एनीमेशन को पूरा करने का इंतजार कर सकता था। हालांकि, एक प्रतीक के बाद मैं जिस फ़ंक्शन को कॉल करना चाहता हूं, वह प्रोग्राम रन के साथ भिन्न हो सकता है, और यह मेरे शुरुआती चरणों को तोड़ देगा (_actionOnButtonClicked() _ फ़ंक्शन में प्रदर्शन किया जाएगा)। मेरे कोड नमूने में नोट, मैंने सरलीकरण उद्देश्य के लिए उस फ़ंक्शन में कई ऑब्जेक्ट्स बनाने के लिए _for_ का उपयोग किया होगा, लेकिन यह फ़ंक्शन वास्तव में विभिन्न ऑब्जेक्ट सृजन के बीच कई संचालन करता है ... – Benoit

0

यह थोड़ी देर हो गया है, मैंने QML को याद किया है। लेकिन मुझे समाधान का सुझाव देने की कोशिश करें। मुझे लगता है कि यह काम कर सकता है, अगर आप Component.onComlpeted ईवेंट में कॉल कर रहे हैं। मैंने पहले एक बेवकूफ जवाब पोस्ट किया है। अब मैं इसे करने के लिए आलसी/बदसूरत तरीके से बदलता हूं। यह संभवतः ऐसा करने का सही तरीका नहीं है, हालांकि यह कोड आपके उपयोग के मामले में मदद कर सकता है।

CreateObject.js

.pragma library 

var objects = null; 
var objectCount = 0; 
var i = 0; 
var mainWin; 
var x = 0; 
var y = 0; 

function calledOnbuttonAction(parentWindow) 
{ 
    if(objects === null) 
    { 
     mainWin = parentWindow; 
     x = 0; 
     y = 0; 
     objects = new Array(); 
     createObject(x,y); 
    } 

    else 
    { 
     if(x <= mainWin.width) 
      x = x + 28; 
     else 
     { 
      x = 0; 
      if(y <= mainWin.height) 
       y = y + 28; 
      else 
      { 
       console.debug("Exceeded window area!") 
       return; 
      } 
     } 
     createObject(x,y); 
    } 

} 

function createObject(xPos, yPos) 
{ 
    i++; 
    var component = Qt.createComponent("Object.qml"); 
    objects[objectCount++] = component.createObject(mainWin, {"x": xPos, "y": yPos}); 
} 

main.qml

import QtQuick 1.1 
import "CreateObjects.js" as CreateObject 

Rectangle { 
    id: mainWindow 
    width: 360 
    height: 360 

    Text { 
     text: qsTr("Click inside window") 
     anchors.centerIn: parent 
     font.pixelSize: 18 
    } 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      CreateObject.calledOnbuttonAction(mainWindow); //passing the parent window object 
     } 
    } 

} 

Object.qml अपने मामले

//The Symbol 

import QtQuick 1.1 
import "CreateObjects.js" as CreateObject 
Rectangle { 

    id: obj 
    width: 25 
    height: 25 

    gradient: Gradient { 
     GradientStop { 
      position: 0 
      color: "#d11b1b" 
     } 

     GradientStop { 
      position: 1 
      color: "#ea4848" 
     } 
    } 

    property alias animationStatus: completedAnimation 

    NumberAnimation { 
     id: completedAnimation; 
     target: obj; 
     property: "opacity"; 
     duration: 800; 
     from: 0; 
     to: 1.0; 
     onRunningChanged: { 
      if(!running && CreateObject.i < 900) // Decrease or increase the value according to the number of objects you want to create 
      { 
       CreateObject.calledOnbuttonAction(); 
      } 
     } 
    } 

    Component.onCompleted: completedAnimation.running = true; 

} 
0

मैं में // प्रतीक लगता है कि यह QML Timer type आपको जो चाहिए वह प्राप्त करने में आपकी सहायता कर सकता है।

संबंधित मुद्दे