C++ Qt中倒计时的制作

C++ Qt中倒计时的制作,c++,qt,timer,clock,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:

所以,我在这里发现了一些有用的东西,我希望了解它是如何工作的

#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
\ifndef LCDNUMBER\u H
#定义LCDNUMBER_H
#包括
#包括
#包括
#包括
lcdDisplay类:公共QLCDNumber
{
Q_对象
公众:
//QTimer类提供重复和单次触发计时器。
QTimer*objTimer;
//QTime类提供时钟时间函数。
QTime*objTime;
公众:
lcdDisplay(QWidget*parentWidget,int分,int秒)
{
objTimer=新的QTimer();
//使用指定的小时、分钟和秒设置我们自己的时间。
objTime=新的QTime(0,分,秒);
setParent(parentWidget);
//连接(objectA、signalAFromObjectA、objectB、slotAFromObjectB)
//timeout():当计时器超时时,会发出此信号。超时时间可以通过'start(int毫秒)`函数指定。
连接(对象计时器,信号(超时()),这个,插槽(setDisplay());
};
~lcdDisplay(){};
公众时段:
//此插槽在计时器超时(1秒)后调用。
void setDisplay()
{
std::cout setHMS(0,objTime->addSecs(-1).minute(),objTime->addSecs(-1.second());
显示(objTime->toString());
};
};
#恩迪夫
我想理解这一行:
objTime->setHMS(0,objTime->addSecs(-1).minute(),objTime->addSecs(-1.second())

这如何在内部减少分钟和秒数?
从这里开始:

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

addSecs
函数可能会增加或减少秒数。好的但是这是否可以执行
objTime->addSecs(-1).minute(),


setHMS
是如何工作的?

如果你想要倒计时的功能,就使用它。

如果你想要倒计时的功能,就使用它。

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

更新


您新编辑的示例正是我在这里用这个初始答案描述的。计时器每秒触发一次,并调用一个调整时间对象的插槽。此代码示例本身没有秒表那样的倒计时功能。它当前是一个仅显示当前时间值的示例。如果您想让它倒计时,我建议在类中添加一个QTimer,超时1秒。您将超时连接到一个插槽,该插槽将从显示时间中减去1秒。当你启动内部定时器时,它将每秒启动一次。在进行减法运算的插槽中,当时钟值达到零时,您可以停止计时器

更新

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

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

如果代码只预先计算一次新时间,那么它的效率可能会更高

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

不使用
setHMS()

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

如果代码只预先计算一次新时间,那么它的效率可能会更高

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


如果不使用
setHMS()

您的意思可能是
*objTime=objTime->addSecs(-1)
。您可能是指
*objTime=objTime->addSecs(-1)。不回答问题。不回答问题。
*objTime = objTime->addSecs(-1); // Thanks André Caron for the correction