qt - QML 中的时间输入字段

标签 qt qml qtquick2 qtquickcontrols

我需要在 QML 中实现一个 TimeEdit(HH:MM:SS) 字段,类似于 QT C++ 中的 QTimeEdit。在 QML 中,我没有找到 TimeEdit,我已经使用 TextField 实现了类似于 TimeEdit 的控件,如果我添加 inputMask ,那么 正则表达式 是根本没有经过验证,有什么办法可以实现这一目标吗?以下是代码。

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Time Edit")

    TextField{
        id:textEditTD
        text : ""
        inputMethodHints: Qt.ImhDigitsOnly

        inputMask: "dd:dd:dd; "
        validator: RegExpValidator { regExp: /^([0-1]?[0-9]|2[0-3]):([0-5][0-9]):[0-5][0-9]$ / }

        width:100
        height:50
        background:Rectangle{
            color:"transparent"
            border.color: "red"
            border.width:2
            radius:(width * 0.05)
        }
    }
}

最佳答案

我使用以下组合的“向下舍入”QValidator派生的时间输入自定义验证器(添加秒数字段很简单):

#pragma once

#include <QTime>
#include <QValidator>

// almost equiv to RegExpValidator { regExp: /(([01][0-9])|(2[0-3])):([0-5][0-9])/ }
class TimeValidator
        : public QValidator
{

    Q_OBJECT

public :

    explicit TimeValidator(QObject * const parent = Q_NULLPTR)
        : QValidator{parent}
    { ; }

    virtual
    State validate(QString & input, int & pos) const Q_DECL_OVERRIDE
    {
        Q_UNUSED(pos);
        const auto parts = input.splitRef(':');
        if (parts.length() != 2) {
            input = QStringLiteral("00:00");
        } else {
            const int hours = qBound(0, parts.first().toInt(), 23);
            const int minutes = qBound(0, parts.last().toInt(), 59);
            const QTime time{hours, minutes};
            Q_ASSERT(time.isValid());
            input = time.toString("hh:mm");
        }
        return Acceptable;
    }

};

template< typename T >
int qmlRegisterClass(int versionMajor = 1, int versionMinor = 0)
{
    const auto className = T::staticMetaObject.className();
    return ::qmlRegisterType< T >(className, versionMajor, versionMinor, className);
}

// ...

qmlRegisterClass< TimeValidator >();

和带有inputMaskTextFiled:

import TimeValidator 1.0

TextField {
    id: timePicker

    verticalAlignment: TextInput.AlignVCenter
    horizontalAlignment: TextInput.AlignHCenter

    text: "00:00"
    inputMask: "00:00;_"

    validator: TimeValidator {}

    inputMethodHints: Qt.ImhDigitsOnly

    // placeholderText: "00:00" // for implicitWidth
    // Layout.minimumWidth: implicitWidth
    // Layout.fillWidth: true
}

关于qt - QML 中的时间输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243460/

相关文章:

c++ - Qt - 如何绘制平铺像素图?

c++ - 带有数字问题的自然排序文件名 C++

c++ - 如何使用Qt在windows窗体中显示桌面?

c++ - 不同上下文中的 QtQuick 动态对象

android - 如何使用 Qt Necessitas SDK 引发 Android Intent?

qt - 如何定义qml GroupBox标题样式

javascript - QML 内存泄漏发送 XMLHttpRequest

qt - 如何在 QML 中创建圆形鼠标区域

javascript - 如何在qml中删除最后的 Canvas 颜料

qt - 从 C++ 向 QML Video Player 输入视频数据