Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 完成文本字段组时启用按钮_Qt_Qml_Qtquickcontrols_Qtquickcontrols2 - Fatal编程技术网

Qt 完成文本字段组时启用按钮

Qt 完成文本字段组时启用按钮,qt,qml,qtquickcontrols,qtquickcontrols2,Qt,Qml,Qtquickcontrols,Qtquickcontrols2,我只想在一组文本字段被RegExp填充和验证时启用一个按钮。如果您在web注册表单中思考,我需要在QML应用程序中使用相同的行为。当然,我知道可以使用JS代码,但我的目标不是使用它,而是用一种优雅的方式,只使用声明性的qml代码。有什么想法吗 这是一个例子: Label { text: qsTr('First name') } TextField { id: firstNameTextField } Label { text: qsTr('Last name') }

我只想在一组文本字段被RegExp填充和验证时启用一个按钮。如果您在web注册表单中思考,我需要在QML应用程序中使用相同的行为。当然,我知道可以使用JS代码,但我的目标不是使用它,而是用一种优雅的方式,只使用声明性的qml代码。有什么想法吗

这是一个例子:

Label {
    text: qsTr('First name')
}

TextField {
    id: firstNameTextField
}

Label {
    text: qsTr('Last name')
}

TextField {
    id: lastNameTextField
}

Label {
    text: qsTr('email')
}

// Username
TextField {
    id: emailTextField
    placeholderText: qsTr("Enter email")
    smooth: true
    validator: RegExpValidator{ regExp: /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i }
}

Label {
    text: qsTr('Password')
}

TextField {
    id: passwordTextField
}

Label {
    text: qsTr('Re-Password')
}

TextField {
    id: rePasswordTextField
}
Button {
    id:button
    enabled: // all text fields completed and validated
}

下面是一个简单而肮脏的方法。
使用布尔属性作为启用按钮的中间属性,如下所示

Item{
property bool isNameFieldValid : false
property bool isAgeFieldValid : false

TextField {
    id: name
    placeholderText: qsTr("Enter name")
    validator:  RegExpValidator{regExp:"valid JS regEx"}
    onAccepted:isNameFieldValid=true
 }
TextField {
    id: age
    placeholderText: qsTr("Enter name")
    validator:  RegExpValidator{regExp:/[0-9A-F]+/}
    onAccepted:isAgeFieldValid=true
 }
Button{
 id:confirmButton
  enable:isNameFieldValid && isAgeFieldValid
 }
}

但唯一的问题是,只有当用户单击键盘/小键盘上的Enter键时,字段才会得到验证。

以下是以声明方式编码的相同解决方案:

Row {
    TextField {
        id: field1
        placeholderText: qsTr("Enter number 1")
        validator: IntValidator {bottom: 1; top: 9;}
    }
    TextField {
        id: field2
        placeholderText: qsTr("Enter number 2")
        validator: IntValidator {bottom: 11; top: 19;}
    }
    Button {
        id: btn
        text: "Send"
        enabled: field1.acceptableInput && field2.acceptableInput
    }
}
从:

acceptableInput-如果文本字段包含acceptable,则返回true 文本。如果设置了验证程序或输入掩码,则此属性将返回 如果当前文本满足验证程序或掩码作为最终文本,则为true 串


谢谢,正如你所说,这是一种肮脏的方式也许使用QML是不可能的。