QTimeEdit当分钟递增时,如何递增到下一小时?

时间:2017-11-08 19:34:51

标签: c++ qt

QTimeEdit显示hh:mm

此小部件行为非常烦人:当值为09:59时,没有简单的方法可以移至10:00。右侧的旋转框控件仅适用于分钟或小时。当您将光标放在分钟上时,如果值为59,则不允许递增。

要从09:59移至10:00,您需要将59递减至00,然后将09增加至10 ... #39;真的很烦人。

没有选项可以让用户使用spinbox控件逐个递增分钟,然后只需单击一下就可以将值从09:59更改为10:00吗?

2 个答案:

答案 0 :(得分:1)

wrapping设为true

至于小时部分的自动更改,在 QTimeEdit 的子类中重新实现stepBy,如下所示:

<强> MyTimeEdit.h

#ifndef MYTIMEEDIT_H
#define MYTIMEEDIT_H

#include <QTimeEdit>

class MyTimeEdit : public QTimeEdit
{
    Q_OBJECT
public:
    explicit MyTimeEdit(QWidget *parent = nullptr);

    void stepBy(int steps) override;
};

#endif // MYTIMEEDIT_H

<强> MyTimeEdit.cpp

#include "MyTimeEdit.h"

MyTimeEdit::MyTimeEdit(QWidget *parent) : QTimeEdit(parent)
{
    setWrapping(true);
}

void MyTimeEdit::stepBy(int steps)
{
    QTime cur = time();

    QTimeEdit::stepBy(steps);

    if (currentSection() == QDateTimeEdit::MinuteSection) {
        int m = cur.minute();
        if ((m == 0) && (steps < 0))
            setTime(time().addSecs(-3600));
        else if ((m == 59) && (steps > 0))
            setTime(time().addSecs(3600));
    }
    else if (currentSection() == QDateTimeEdit::SecondSection) {
        int s = cur.second();
        if ((s == 0) && (steps < 0))
            setTime(time().addSecs(-60));
        else if ((s == 59) && (steps > 0))
            setTime(time().addSecs(60));
    }
}

答案 1 :(得分:0)

我注意到,使用鼠标滚轮或Page Up / Page Down而不是箭头键时,以上答案无效,因为该步长大于1(在我的情况下为10)。

这是MyTimeEdit.cpp的一个版本,也可以使用鼠标滚轮和Page Up / Down键:

MyTimeEdit.cpp

#include "MyTimeEdit.h"

MyTimeEdit::MyTimeEdit(QWidget *parent) : QTimeEdit(parent)
{
    setWrapping(true);
}

void MyTimeEdit::stepBy(int steps)
{
    if (currentSection() == QDateTimeEdit::MinuteSection) {
        setTime(time().addSecs(steps*60));
    }
    else if (currentSection() == QDateTimeEdit::SecondSection) {
        setTime(time().addSecs(steps));
    }
}