QML中的时间输入字段 在Qt+C++中,我需要在QML中实现一个类似于QTimeEdge/的代码< > TimeEdge< /Cuff>(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) } } }

QML中的时间输入字段 在Qt+C++中,我需要在QML中实现一个类似于QTimeEdge/的代码< > TimeEdge< /Cuff>(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) } } },qt,qml,qtquick2,qtquickcontrols,Qt,Qml,Qtquick2,Qtquickcontrols,我使用以下“向下取整”QValidator-派生的自定义时间输入验证器的组合(添加秒字段很简单): 我找到了两种实现方法: 1) 我更改了方向答案以满足我的要求,以下是按下退格时的更改: virtual State validate(QString & input, int & pos) const Q_DECL_OVERRIDE { const QStringList parts = input.split(":"); if (parts.length() !=

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


我找到了两种实现方法:

1) 我更改了方向答案以满足我的要求,以下是按下
退格
时的更改:

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) 只需更改
inputMask
RegExp
,这非常简单:

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])$ / }

也许RegExp末尾的空格是问题所在?谢谢你的回答,但是当使用
backspace
键时会出现问题,例如:如果我输入
12:30
,然后单击
backspace
,值会变成
01:03
,但它应该变成
00:00
,你能建议如何实现吗此?@pra7有
pos
可修改参数。您可以对其进行更复杂的逻辑更改。@pra7无论如何输入是经过验证的,并且总是可以接受的。谢谢您的建议。。。我做了一些改变以满足我的要求。
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;
}
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])$ / }