用QML测量经过的时间

时间:2015-06-23 08:03:09

标签: qt time qml qtquick2 qt-quick

让我们考虑以下示例:我们有一个Qt快速控制Button。用户在5秒内点击两次。在第一次推送Button之后,QML Timer正在运行这5秒钟。我们希望测量两次点击之间经过的时间,精确度为毫秒。

不幸的是,QML Timer无法向我们显示已用时间。

正如BlackBerry论坛上所建议的那样,可以比较日期。但是,这不是很方便,因为第一次点击可能发生在31 Dec 2015, 23:59:55上,第二次点击发生在1 Jan 2016, 00:00:05上,因此检查必须很复杂。

还有更好的选择吗?

3 个答案:

答案 0 :(得分:11)

正如评论中所解释的那样,QML Timer不适合您的特定需求,因为它与动画计时器(更多细节here)同步,因此其分辨率也取决于动画计时器

@qCring解决方案肯定令人满意,如果需要更高的精度或更好的性能,我更喜欢这种方法(另请参阅this answer以及底部关于提高精度的有趣链接)。

但是,根据您的要求, QML / JS方法是完全可行的。在这种情况下,您可以使用JavaScript Date,因为它easy to calculate elapsed time使用getTime(),但也因为QML完全支持JS Date以及{{3它有一些有用的功能。

这是一个简单的例子:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.3

ApplicationWindow {
    width: 300
    height: 300
    visible: true

    property double startTime: 0

    ColumnLayout {
        anchors.fill: parent

        Text {
            id: time
            font.pixelSize: 30
            text: "--"
            Layout.alignment: Qt.AlignCenter
        }

        Button {
            text: "Click me!"
            Layout.alignment: Qt.AlignCenter

            onClicked: {
                if(startTime == 0){
                    time.text = "click again..."
                    startTime = new Date().getTime()
                } else {
                    time.text = new Date().getTime() - startTime + " ms"
                    startTime = 0
                }
            }
        }
    }
} 

答案 1 :(得分:5)

不幸的是,QML Timer没有提供检查已用时间的属性。但您可以用C ++编写自定义Timer并将其公开给QML:

MyTimer.h

#include <QObject>
#include <QElapsedTimer>

class MyTimer : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int elapsed MEMBER m_elapsed NOTIFY elapsedChanged)
    Q_PROPERTY(bool running MEMBER m_running NOTIFY runningChanged)
private:
    QElapsedTimer m_timer;
    int m_elapsed;
    bool m_running;
public slots:
    void start() {
        this->m_elapsed = 0;
        this->m_running = true;

        m_timer.start();
        emit runningChanged();
    }

    void stop() {
        this->m_elapsed = m_timer.elapsed();
        this->m_running = false;

        emit elapsedChanged();
        emit runningChanged();
    }

signals:
    void runningChanged();
    void elapsedChanged();
};

通过QML中提供的qmlRegisterType<MyTimer>("MyStuff", 1, 0, "MyTimer")注册后

Window.qml

import QtQuick 2.4
import QtQuick.Controls 1.3
import MyStuff 1.0

ApplicationWindow {
    width: 800
    height: 600
    visible: true

    Button {
        id: button
        anchors.centerIn: parent
        text: timer.running ? "stop" : "start"
        checkable: true

        onClicked: {
            if (timer.running) {
                timer.stop()
                label.text = timer.elapsed + "ms"
            } else { 
                timer.start()
            }
        }

        MyTimer {
            id: timer
        }
    }

    Text {
        id: label
        anchors.left: button.right
        anchors.verticalCenter: button.verticalCenter
        text: "0ms"
        visible: !timer.running
    }
}

希望这有帮助!

答案 2 :(得分:3)

在您的问题中,您没有提及测量的时间是仅用于调试目的还是其他计算需要的时间。因为如果不是QML提供了very simple way来调试使用/** * Stops the process. */ public function stop() { $this->process->signal(SIGTERM); $this->process->stop(3, SIGKILL); } $(document).ready(function() { $('#nav').affix({ offset: { top: 90 } }); $('#sidebar').affix({ offset: { top: 17 } }); }); $(document).ready(function() { $(window).scroll(function() { if ($(this).scrollTop() > 50) { $('#back-to-top').fadeIn(); } else { $('#back-to-top').fadeOut(); } }); // scroll body to 0px on click $('#back-to-top').click(function() { $('#back-to-top').tooltip('hide'); $('body,html').animate({ scrollTop: 0 }, 800); return false; }); $('#back-to-top').tooltip('show'); }); 进行各种操作所花费的时间。

使用console.time("id string")的示例如下所示:

console.timeEnd("id string")

这将以毫秒为单位将时间打印到控制台,对于测量在QML中执行某些长操作所需的时间非常有用。