2015-02-13 5 views
13

मैं जावास्क्रिप्ट में देरी फ़ंक्शन बनाना चाहता हूं जो देरी के लिए समय की मात्रा का पैरामीटर लेता है, ताकि मैं इसका उपयोग कर सकूं, मेरे क्यूएमएल एप्लिकेशन में जावास्क्रिप्ट लाइनों के निष्पादन के बीच देरी शुरू करें। यह शायद इस प्रकार दिखाई देगा:क्यूएमएल में देरी कार्य कैसे बनाएं?

function delay(delayTime) { 
// code to create delay 
} 

मैं समारोह delay() के शरीर की जरूरत है। ध्यान दें कि जावास्क्रिप्ट का setTimeout() क्यूएमएल में काम नहीं करता है।

+2

बस एक टाइमर तत्व का उपयोग करें: http://doc.qt.io/qt-5/qtimer.html – MrEricSir

+0

विकल्प यहाँ टिप्पणी में कर रहे हैं। उन लोगों के अलावा, एनीमेशन ढांचा काफी समृद्ध है और एनिमेशन को नियंत्रित करने के कई तरीकों को प्रदान करता है। दस्तावेज़ों में खोदें या अपनी एनीमेशन जरूरतों को हल करने के लिए एक प्रश्न पोस्ट करें (संपादित करें)। – BaCaRoZzo

+1

डाउन वोट क्यों? मुझे लगता है कि यह एक पूरी तरह से वैध सवाल है। –

उत्तर

22

जैसा कि आपके प्रश्न पर टिप्पणियों में सुझाव दिया गया है, Timer घटक इसका एक अच्छा समाधान है।

function Timer() { 
    return Qt.createQmlObject("import QtQuick 2.0; Timer {}", root); 
} 

timer = new Timer(); 
timer.interval = 1000; 
timer.repeat = true; 
timer.triggered.connect(function() { 
    print("I'm triggered once every second"); 
}) 

timer.start(); 

उपरोक्त होगा कि मैं वर्तमान में इसका उपयोग कैसे कर रहा हूं, और यहां बताया गया है कि मैंने आपके प्रश्न में उदाहरण कैसे लागू किया होगा।

function delay(delayTime) { 
    timer = new Timer(); 
    timer.interval = delayTime; 
    timer.repeat = false; 
    timer.start(); 
} 

(कौन सा कुछ भी नहीं करता है, पर पढ़ें)

हालांकि सटीक तरह से आप देख रहे हैं यह लागू किया जाना के लिए पता चलता है कि आप की अगली पंक्ति तक ब्लॉक करने के लिए इसे देख रहे आपका प्रोग्राम निष्पादित करता है। लेकिन यह इसके बारे में जाने का एक बहुत अच्छा तरीका नहीं है क्योंकि यह आपके प्रोग्राम में अन्य सभी को अवरुद्ध करेगा क्योंकि जावास्क्रिप्ट केवल निष्पादन के एक थ्रेड में चलता है।

कॉलबैक पास करने का एक विकल्प है।

function delay(delayTime, cb) { 
    timer = new Timer(); 
    timer.interval = delayTime; 
    timer.repeat = false; 
    timer.triggered.connect(cb); 
    timer.start(); 
} 

जो आपको इसका उपयोग करने की अनुमति देगा।

delay(1000, function() { 
    print("I am called one second after I was started."); 
}); 

उम्मीद है कि यह मदद करता है!

संपादित करें: उपरोक्त मानते हैं कि आप एक अलग जावास्क्रिप्ट फ़ाइल में काम कर रहे हैं जिसे बाद में आप अपनी क्यूएमएल फ़ाइल में आयात करते हैं। एक क्यूएमएल फ़ाइल में समकक्ष करने के लिए, आप यह कर सकते हैं।

import QtQuick 2.0 

Rectangle { 
    width: 800 
    height: 600 

    color: "brown" 

    Timer { 
     id: timer 
    } 

    function delay(delayTime, cb) { 
     timer.interval = delayTime; 
     timer.repeat = false; 
     timer.triggered.connect(cb); 
     timer.start(); 
    } 

    Rectangle { 
     id: rectangle 
     color: "yellow" 
     anchors.fill: parent 
     anchors.margins: 100 
     opacity: 0 

     Behavior on opacity { 
      NumberAnimation { 
       duration: 500 
      } 
     } 
    } 

    Component.onCompleted: { 
     print("I'm printed right away..") 
     delay(1000, function() { 
      print("And I'm printed after 1 second!") 
      rectangle.opacity = 1 
     }) 
    } 
} 

मुझे विश्वास नहीं है कि यह आपकी वास्तविक समस्या का समाधान है; एनीमेशन में देरी करने के लिए, आप PauseAnimation का उपयोग कर सकते हैं।

+0

ए यह भी सोचता है कि 'टाइमर' अच्छा समाधान है – folibis

1

आप उपयोग कर सकते QtTest

import QtTest 1.0 
import QtQuick 2.9 

ApplicationWindow{ 
    id: window 

    TestEvent { 
     id: test 
    } 

    function delay_ms(delay_time) { 
     test.mouseClick(window, 0, 0, Qt.NoButton, Qt.NoModifier, delay_time) 
    } 
} 
संबंधित मुद्दे