在Qt中倒数计时器

时间:2012-02-14 06:07:58

标签: c++ qt timer clock

所以,我找到了在这里工作的东西,我希望了解它是如何工作的。

#ifndef  LCDNUMBER_H
#define LCDNUMBER_H

#include <QLCDNumber>
#include <QTimer>
#include <QTime>
#include <iostream>

class lcdDisplay : public QLCDNumber
{
    Q_OBJECT  

    public:
        // The QTimer class provides repetitive and single-shot timers.
        QTimer* objTimer;
        // The QTime class provides clock time functions.
        QTime*  objTime;

    public:
        lcdDisplay (QWidget *parentWidget, int minutes, int seconds)
        {
            objTimer = new QTimer ();
            // Setting our own time with the specified hours, minutes, and seconds.
            objTime  = new QTime  (0, minutes, seconds);

            setParent (parentWidget);

            // connect (objectA, signalAFromObjectA, objectB, slotAFromObjectB)
            // timeout (): This signal is emitted when the timer times out. The time out period can be specified with `start (int milliseconds)` function.
            QObject :: connect (objTimer, SIGNAL (timeout ()), this, SLOT (setDisplay ()));
        };

        ~ lcdDisplay () {};

    public slots:
        // This slot is called after the timer timeouts (1 second).
        void setDisplay ()
        {
            std::cout << "\nf,gfd,mgnfdm,gnf,\n";
            // 
            objTime->setHMS (0, objTime->addSecs (-1).minute (), objTime->addSecs (-1).second ());
            display (objTime->toString ());
        };
};
#endif

我希望理解这一行:objTime->setHMS (0, objTime->addSecs (-1).minute (), objTime->addSecs (-1).second ());

这如何减少内部的分钟和秒数?
从这里开始:http://doc.qt.nokia.com/4.7/qtime.html#addSecs

  

QTime n(14,1,0); // n == 14:00:00
   QTime t;
   t = n.addSecs(70); // t == 14:01:10
   t = n.addSecs(-70); // t == 13:58:50

addSecs函数可能会增加或减少秒数。精细。但是这样做objTime->addSecs (-1).minute (),吗?

setHMS如何运作?

3 个答案:

答案 0 :(得分:3)

如果您想要倒数计时器,请使用QTimer class

答案 1 :(得分:1)

此代码示例本身没有像秒表那样倒计时的功能。它目前只是显示当前时间值的显示示例。如果你想要的是让它倒计时,我建议你在课堂上添加一个QTimer,超时时间为1秒。您将超时连接到一个插槽,该插槽将从您的显示时间减去一秒。当你启动内部计时器时,它会每秒启动一次。在您的插槽中进行减法,您可以在时钟值达到零时停止计时器。

<强>更新

您新编辑的示例正是我在此处使用此初始答案所描述的内容。计时器每秒触发一次并调用一个调整时间对象的插槽

答案 2 :(得分:1)

objTime->addSecs(-1)不会更改objTime,但会返回比objTime小一秒的新QTime对象。 然后.minute()返回新QTime对象的分钟部分,.second()返回新QTime对象的第二部分。

如果只预先计算一次新时间,代码可能会更有效。

此行也可以改写为(但下面的新代码也考虑了小时数):

*objTime = objTime->addSecs(-1); // Thanks André Caron for the correction

不使用setHMS()