खोज…


टिप्पणियों

क्यूटीमर का उपयोग फ़ंक्शन को चलाने के लिए अनुरोध करने के लिए भी किया जा सकता है जैसे ही इवेंट लूप ने अन्य सभी लंबित घटनाओं को संसाधित किया है। ऐसा करने के लिए, 0 एमएस के अंतराल का उपयोग करें।

// option 1: Set the interval to 0 explicitly.
QTimer *timer = new QTimer;
timer->setInterval( 0 );
timer->start();

// option 2: Passing 0 with the start call will set the interval as well.
QTimer *timer = new QTimer;
timer->start( 0 );

// option 3: use QTimer::singleShot with interval 0
QTimer::singleShot(0, [](){
    // do something
});

सरल उदाहरण है

निम्नलिखित उदाहरण से पता चलता है कि प्रत्येक 1 सेकंड में एक स्लॉट को कॉल करने के लिए QTimer का उपयोग कैसे किया जाता है।

उदाहरण में, हम अपने मूल्य को अपडेट करने के लिए एक QProgressBar का उपयोग करते हैं और टाइमर ठीक से काम कर रहा है इसकी जांच करते हैं।

main.cpp

#include <QApplication>

#include "timer.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Timer timer;
    timer.show();

    return app.exec();
}

timer.h

#ifndef TIMER_H
#define TIMER_H

#include <QWidget>

class QProgressBar;

class Timer : public QWidget
{
    Q_OBJECT

public:
    Timer(QWidget *parent = 0);

public slots:
    void updateProgress();

private:
    QProgressBar *progressBar;
};

#endif

timer.cpp

#include <QLayout>
#include <QProgressBar>
#include <QTimer>

#include "timer.h"

Timer::Timer(QWidget *parent)
    : QWidget(parent)
{
    QHBoxLayout *layout = new QHBoxLayout();

    progressBar = new QProgressBar();
    progressBar->setMinimum(0);
    progressBar->setMaximum(100);

    layout->addWidget(progressBar);
    setLayout(layout);

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Timer::updateProgress);
    timer->start(1000);

    setWindowTitle(tr("Timer"));
    resize(200, 200);
}

void Timer::updateProgress()
{
    progressBar->setValue(progressBar->value()+1);
}

timer.pro

QT += widgets

HEADERS = \
          timer.h
SOURCES = \
           main.cpp \
           timer.cpp

स्लॉट के रूप में लैम्ब्डा फ़ंक्शन के साथ सिंगल्सशॉट टाइमर

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

QTimer::singleShot(1000, []() { /*Code here*/ } );

इस बग (QTBUG-26406) के कारण , यह Qt5.4 के बाद से ही संभव है।

पहले Qt5 संस्करणों में इसे अधिक बॉयलर प्लेट कोड के साथ किया जाना चाहिए:

  QTimer *timer = new QTimer(this);
  timer->setSingleShot(true);

  connect(timer, &QTimer::timeout, [=]() {
    /*Code here*/
    timer->deleteLater();
  } );

मुख्य धागे पर कोड चलाने के लिए क्यूटीमर का उपयोग करना

void DispatchToMainThread(std::function<void()> callback)
{
    // any thread
    QTimer* timer = new QTimer();
    timer->moveToThread(qApp->thread());
    timer->setSingleShot(true);
    QObject::connect(timer, &QTimer::timeout, [=]()
    {
        // main thread
        callback();
        timer->deleteLater();
    });
    QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection, Q_ARG(int, 0));
}

यह उपयोगी है जब आपको एक थ्रेड से UI तत्व को अपडेट करने की आवश्यकता होती है। किसी भी कॉलबैक संदर्भ के जीवनकाल को ध्यान में रखें।

DispatchToMainThread([]
{
    // main thread
    // do UI work here
});

समान कोड को QT ईवेंट लूप चलाने वाले किसी भी थ्रेड पर कोड चलाने के लिए अनुकूलित किया जा सकता है, इस प्रकार एक साधारण प्रेषण तंत्र लागू होता है।

मूल उपयोग

QTimer एक विशिष्ट फ़ंक्शन / स्लॉट को एक निश्चित अंतराल (बार-बार या सिर्फ एक बार) के बाद कॉल करने के लिए कार्यक्षमता जोड़ते हैं।

QTimer इस प्रकार एक जीयूआई एप्लिकेशन को नियमित रूप से "चेक" करने की अनुमति देता है या मैन्युअल रूप से इसके लिए एक अतिरिक्त धागा शुरू करने के बिना टाइमआउट को संभालता है और दौड़ की स्थिति के बारे में सावधान रहना चाहिए, क्योंकि टाइमर को मुख्य-इवेंट लूप में संभाला जाएगा।

एक टाइमर बस इस तरह इस्तेमाल किया जा सकता है:

QTimer* timer = new QTimer(parent); //create timer with optional parent object
connect(timer,&QTimer::timeout,[this](){ checkProgress(); }); //some function to check something
timer->start(1000); //start with a 1s interval

समय पूरा होने पर टाइमर timeout सिग्नल को ट्रिगर करता है और इसे मेन-इवेंट लूप में कहा जाएगा।

QTimer :: सिंगलशॉट सरल उपयोग

क्यूटीमर :: सिंगलशॉट का उपयोग n एमएस के बाद एक स्लॉट / लैम्ब्डा को अतुल्यकालिक रूप से कॉल करने के लिए किया जाता है।

मूल वाक्यविन्यास है:

QTimer::singleShot(myTime, myObject, SLOT(myMethodInMyObject()));

ms में समय के साथ myTime , myObject ऑब्जेक्ट को विधि और myMethodInMyObject को कॉल करने के लिए स्लॉट में शामिल करें

इसलिए उदाहरण के लिए यदि आप एक टाइमर रखना चाहते हैं जो एक डिबग लाइन "हैलो!" हर 5 सेकंड:

सीपीपी

void MyObject::startHelloWave()
{
    QTimer::singleShot(5 * 1000, this, SLOT(helloWave()));
}

void MyObject::helloWave()
{
    qDebug() << "hello !";
    QTimer::singleShot(5 * 1000, this, SLOT(helloWave()));
}

.hh

class MyObject : public QObject {
    Q_OBJECT
    ...
    void startHelloWave();

private slots:
    void helloWave();
    ...
};


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow