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