簡體   English   中英

QML中的時間輸入字段

[英]Time input field in QML

我需要在QML中實現類似於QT C ++中的QTimeEditTimeEdit (HH:MM:SS)字段。 在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派生的時間輸入自定義驗證器(添加秒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 >();

TextFiledinputMask

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
}

我發現了兩種方法可以實現此目的:

1)我對東方答案進行了更改以滿足我的要求,以下是按下backspace時可以進行的更改:

virtual
State validate(QString & input, int & pos) const Q_DECL_OVERRIDE
{
    const QStringList parts = input.split(":");
    if (parts.length() != 3) {
        input = QStringLiteral("00:00:00");
    }
    else
    {
        int hours = 0;
        int minutes = 0;
        int seconds = 0;

        //hours
        if(parts[0].toInt() > 23){
            hours = 23;
            pos +=1; //Increment the position
        }
        else{
            QString str = parts[0];
            if(str.contains(" ")){
                str.replace(" ","0");
            }
            hours = str.toInt();
        }

        // Minutes
        if(parts[1].toInt() > 59){
            minutes = 59;
            pos +=1; //Increment the position
        }
        else{
            QString str = parts[1];
            if(str.contains(" ")){
                str.replace(" ","0");
            }
            minutes = str.toInt();
        }

        //Seconds
        if(parts[2].toInt() > 59){
            seconds = 59;
            pos +=1; //Increment the position
        }
        else{
            QString str = parts[2];
            if(str.contains(" ")){
                str.replace(" ","0");
            }
            seconds = str.toInt();
        }

        const QTime time{hours, minutes,seconds};
        Q_ASSERT(time.isValid());
        input = time.toString("hh:mm:ss");
    }
    return Acceptable;
}

2)僅通過更改inputMaskRegExp ,這非常簡單:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM