QTimer的剩余时间

6
在我的一个项目中,我正在使用一个QTimer并且想知道是否可以获取QTimer的剩余时间,以便让用户知道“下一次超时时间:10秒”之类的信息...是否有可能实现这一点?如果不行,有没有任何好的想法来实现这个功能呢?
也许我需要自己编写一个定时器...

在Qt5中有一个名为remainingTime的属性。 - bartolo-otrit
4个回答

6

这是您要找的内容吗?QTimer::elapsed() 使用计算机时钟,因此根据您的平台,准确性会有所不同。

class MyTimer : QTimer
{
    MyTimer(QObject* parent) : QTimer(parent)
    {
      connect(this, timeout(), this, resettime());
    }

    int start()
    {
      m_time.start();
      return QTimer::start();
    }

    int start(int msec)
    {
      m_time.start();
      return QTimer::start(msec)l
    }


    int timeLeft()
    {
      return interval()-m_time.elapsed()
    }

  private slots:

    void resettime()
    {
      m_time.restart();
    }

  private:
    QTime m_time;
}

3
感谢您的建议,但我找到了另一种解决方案。我编写了自己的类my_timer,它只有一个内部次要计时器,每秒钟超时一次。在我的主窗口中,我将此超时连接到一个函数,该函数更新用户的显示。
my_timer.cpp文件:
#include "my_timer.hpp"

my_timer::my_timer( QWidget *parent ) : QTimer( parent )
{
    notifier = new QTimer;
}

my_timer::~my_timer()
{
    //...
}

QTimer* my_timer::get_notifier()
{
    return notifier;
}

void my_timer::start( int msec )
{
    QTimer::start( msec );
    notifier->start( 1000 );
}

void my_timer::stop()
{
    QTimer::stop();
    notifier->stop();
}

在我的 main_window.cpp 中:

void main_window::setup_connects()
{
        // ...
    connect( m_timer->get_notifier(), SIGNAL(timeout()), this, SLOT(on_update_label()) );
        // ...
}

void main_window::on_update_label()
{
    if( m_timer->isActive() )
    {
        if( remaining_secs > 1 )
        {
            remaining_secs--;   
        }
        else
        {
            remaining_secs = spin_box->value();
        }

        update_label();
    }
}

void main_window::update_label()
{
    m_time_string = QString( "Remaining time until next execution: %1" ).arg( remaining_secs );
    m_time_label->setText( m_time_string );
}

1
不是一个坏的方法,但如果你要这样做,我建议将更多内容封装到my_timer类中。例如,添加每秒信号和最终超时信号,这样使用它的类就不必获取通知器计时器并连接它了。你还可以在该类中跟踪经过的时间和剩余时间。 - Caleb Huitt - cjhuitt

2

查看QObject的timerEvent事件。我认为你可以使用它来实现您想要的功能。


1
为了完整起见:
#ifndef _ELAPSED_TIMER_H_
#define _ELAPSED_TIMER_H_

#include <QTimer>
#include <QTime>

/* 
 * convenience class, which can return the proportion of the time left. usefull for interpolation
 * tasks
 **/
class ElapsedTimer : public QTimer
{
    Q_OBJECT

    public:
        ElapsedTimer(QObject* parent) : QTimer(parent)
        {
            connect(this, SIGNAL(timeout()), this, SLOT(resettime()));
        }

        void start()
        {
            m_time.start();
            QTimer::start();
        }

        void start(int msec)
        {
            m_time.start();
            QTimer::start(msec);
        }

        double proportionLeft()
        {
            return (interval()-m_time.elapsed())/interval();
        }

        int timeLeft()
        {
            return interval()-m_time.elapsed();
        }

    private slots:

        void resettime()
        {
            m_time.restart();
        }

    private:
        QTime m_time;
};

#endif/*_ELAPSED_TIMER_H_*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接