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