動機
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")
}
}