开发者

How to provide auto change for a QTimeEdit?

I have a QTimeEdit widget on my dialog and I want to provide some kind of autochange - if the cursor is on minutes section and the time is 04:59, the next click on the arrow up would lead the time to change to 5:00.

How to do that?

I saw some mention of AutoAdvance property but I suppose it's obsolete because I cannot fin开发者_开发知识库d it in Qt 4.7.


I noticed there is a signal called void timeChanged ( const QTime & time ). You can connect it to a slot and call function void QAbstractSpinBox::stepBy ( int steps ) in the slot function.

EDIT1:

Sorry for the misleading. In fact, we don't really need void timeChanged ( const QTime & time ). See the code below:

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);
        }
    }
};

Keep in mind, you need to setWrapping(true) yourself.


I don't know whether it's still interesting, but I found another solution:

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);     
    } };


If some one is wondering how to automatically change time (because I did), and needs easy, rather clean solution, here's what I came up with:

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);
    }

};
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜