如何为QTimeEdit提供自动更改?

如何为QTimeEdit提供自动更改?,qt,Qt,我的对话框中有一个QTimeEdit小部件,我想提供某种自动更改-如果光标在分钟部分,时间是04:59,下一次单击向上箭头将导致时间更改为5:00 怎么做 我看到有人提到AutoAdvance属性,但我想它已经过时了,因为我在Qt4.7中找不到它。我注意到有一个信号称为void timeChanged(const QTime&time)。您可以将其连接到插槽,并在插槽函数中调用函数void QAbstractSpinBox::stepBy(int steps) EDIT1: 对不起,这是误导。事

我的对话框中有一个QTimeEdit小部件,我想提供某种自动更改-如果光标在分钟部分,时间是04:59,下一次单击向上箭头将导致时间更改为5:00

怎么做


我看到有人提到AutoAdvance属性,但我想它已经过时了,因为我在Qt4.7中找不到它。

我注意到有一个信号称为
void timeChanged(const QTime&time)
。您可以将其连接到插槽,并在插槽函数中调用函数
void QAbstractSpinBox::stepBy(int steps)

EDIT1

对不起,这是误导。事实上,我们并不真正需要
voidtimechanged(constqtime&time)
。 请参阅下面的代码:

class myTime : public QTimeEdit
{
    Q_OBJECT
public:
    virtual void stepBy(int steps)
    {
        if (this->time().minute()==59 && steps>0){
            setTime(QTime(time().hour()+1,0,time().second(),time().msec()));
        }else if(this->time().minute()==00 && steps<0){
            setTime(QTime(time().hour()-1,59,time().second(),time().msec()));
        }else{
            QTimeEdit::stepBy(steps);
        }
    }
};
class myTime:public QTimeEdit
{
Q_对象
公众:
虚拟void步进比(int步)
{
如果(此->时间().minute()==59&&steps>0){
设置时间(QTime(time().hour()+1,0,time().second(),time().msec());

}如果(this->time().minute()==00&&steps我不知道它是否仍然有趣,但我找到了另一个解决方案:

class myTime : public QTimeEdit {
    Q_OBJECT public:
    virtual void stepBy(int steps)
    {
     long lFactor=1;
     if (currentSection()==QDateTimeEdit::MinuteSection)
      lFactor=60;
     else if (currentSection()==QDateTimeEdit::HourSection)
      lFactor=3600;

     long lDateTime = (dateTime().toMSecsSinceEpoch()/1000)+(steps*lFactor);
     QDateTime dt = QDateTime::fromMSecsSinceEpoch(1000*(qint64)(lDateTime));
     setDateTime(dt);     
    } };

如果有人想知道如何自动更改时间(因为我这样做了),并且需要简单、相当干净的解决方案,那么下面是我的想法:

class TimeWidget : public QTimeEdit {
      Q_OBJECT
      public:
      void stepBy(int steps) {
          //Grab the current time
          QTime t = time();

         //So we edit the time as in raw milliseconds. Larger type would be better in this case.
         //But 32bits is more than enough for day amount of milliseconds.
         int raw = (t.hour()*360000 + t.minute()*60000 + t.second() * 1000 + t.msec());

         //Let's find out what section time widget is changing
         //And edit the raw millisecond data accordingly. 
         switch(currentSection()) {
              case QDateTimeEdit::MSecSection:
                   raw += steps;
              break;
              case QDateTimeEdit::SecondSection:
                   raw += steps*1000;
              break;
              case QDateTimeEdit::MinuteSection:
                  raw+= steps*60000;
              break;
              case QDateTimeEdit::HourSection:
                 raw += steps*3600000;
              break;
       }

       //Now we just split the "raw" milliseconds into
       int hrs = (raw/ 36000000) % 24; //... hours
       int mins = (raw/ 60000) % 60; //... minutes
       int secs = (raw / 1000) % 60; //... seconds
       int mills = raw % 1000;  //... milliseconds

       //Update & save the current time
       t.setHMS(hrs, mins, secs, mills);
       setTime(t);
    }

};

该功能在3.3和4.0之间消失。它似乎是一个很好的功能保留。抱歉延迟回答,但最后我尝试了你的方法。问题是我需要在单击箭头时做出响应,例如向上,但不是更改时间!因为它永远不会发生!例如,秒数w我不会超过59岁。这意味着如果我改变了时间,我应该跟踪什么时间?59?但59只是59,我不需要响应从58到59的更改,而将59更改为60将永远不会发生。因此,现在我的问题是如何响应箭头单击?非常感谢您的帮助。我已经尝试了您的代码,但它可以工作,但问题是,例如秒数为59,并且选择了此部分(秒)即使我单击向上箭头,也不会发生任何情况。出于某种原因,在这种情况下不会调用Steppy。也许我描述的问题是错误的-但我需要的是:当我停留在秒上时,如果是59,我单击向上,秒数应为0,分钟数应增加1。但由于某种原因,当值为59,如果我单击箭头,则不会调用此方法奇怪的是QAbstractSpin的Steppey:“请注意,即使结果值超出最小值和最大值的界限,也会调用此函数。处理这些情况是此函数的工作。”-来自文档,但在我看来,开发人员更改了QtimeEdit的行为。这是因为我只在分钟为59时编写代码。这只是一个示例代码,您应该自己完成。