LoginSignup
2
1

More than 5 years have passed since last update.

QTimerをラップするQMLエレメントを作成する

Last updated at Posted at 2016-05-02

動機

QMLにはTimerエレメントが存在しているが、精度が非常に悪い(原因不明、情報求む)。
そこで応急処置としてQTimerをラップするエレメントを作成することにした。

参考: http://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html

コード

cpptimer.h
#pragma once

#include <QObject>
#include <QTimer>

class CppTimer : public QObject {
    Q_OBJECT
    Q_PROPERTY(int interval MEMBER interval_ NOTIFY intervalChanged)
public:

    CppTimer();

    Q_INVOKABLE void start();
    Q_INVOKABLE void restart();
    Q_INVOKABLE void stop();

    void updateInterval();

signals:
    void triggered();
    void intervalChanged();

private:
    QTimer timer_;
    int interval_;
};
cpptimer.cpp
#include "cpptimer.h"

CppTimer::CppTimer()
    : QObject()
    , timer_(this)
    , interval_(0)
{
    connect(&timer_, &QTimer::timeout, this, &CppTimer::triggered);
    connect(this, &CppTimer::intervalChanged,
            this, &CppTimer::updateInterval);
    timer_.setSingleShot(true);
}

void CppTimer::start() {
    if (!timer_.isActive()) {
        timer_.start(interval_);
    }
}

void CppTimer::restart() {
    timer_.start(interval_);
}

void CppTimer::stop() {
    timer_.stop();
}

void CppTimer::updateInterval() {
    if (timer_.isActive()) {
        timer_.start(interval_);
    }
}

登録

C++側でqRegisterTypeを使用して登録をおこなう

qmlRegisterType<CppTimer>("com.itage.timer", 1, 0, "CppTimer");

使用

importして使用できる


import com.itage.timer 1.0
//(中略)
CppTimer {
  id: timer
  onTriggered: {
    console.log("onTriggered")
  }
}
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1