我想在TextField
有可接受的文本时启用按钮(我使用的是validator
),并且此代码运行良好:
import QtQuick 2.3
import QtQuick.Controls 1.2
ApplicationWindow {
visible: true
width: 400
height: 100
id: mainWindow
property int _buttonSize: 30
property int _interval: 10
TextField {
y: _interval
width: parent.width
height: _buttonSize
id: ipInput
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
placeholderText: "IP"
validator: RegExpValidator
{
regExp:/^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5])).){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$/
}
}
Button {
enabled: ipInput.acceptableInput
id: go
anchors.horizontalCenter: parent.horizontalCenter
y: ipInput.y+_buttonSize+_interval
width: parent.width
height: _buttonSize
text: "GO"
}
}
因此,我将Action
添加到这个Button
:中
Button {
enabled: ipInput.acceptableInput
id: go
anchors.horizontalCenter: parent.horizontalCenter
y: ipInput.y+_buttonSize+_interval
width: parent.width
height: _buttonSize
text: "GO"
action: goAction
Action {
id: goAction
shortcut: "Enter"
enabled: go.enabled && go.visible
onTriggered: {
console.log("good")
}
}
}
现在Button
始终处于禁用状态。我该怎么修?
Action
通过同步它们所绑定的所有Item
的状态来工作。文件上写着:
在应用程序中,许多常见命令可以通过菜单、工具栏按钮和键盘快捷键调用。由于用户期望每个命令都以相同的方式执行,因此无论使用何种用户界面,将每个命令表示为一个操作都很有用。
操作可以绑定到菜单项和工具栏按钮,它将自动保持它们的同步。例如,在文字处理器中,如果用户按下粗体工具栏按钮,则会自动选中粗体菜单项。
从这个意义上说,Action
的属性规则于它所绑定的Item
s的属性,反之亦然。当启用Action
时,所有与其相连的Item
s也将启用。因此,启用条件应该移动到Action
。
这是您代码的重新访问版本。我添加了另一个Button
来强调Action
的功能。在这里,当满足条件时,两个Button
都会自动启用,因为它是相关的Action
。
import QtQuick 2.3
import QtQuick.Controls 1.2
ApplicationWindow {
visible: true
id: mainWindow
Column {
spacing: 10
TextField {
width: 400
height: 40
id: ipInput
horizontalAlignment: TextInput.AlignHCenter
placeholderText: "IP"
validator: RegExpValidator {
regExp:/^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5])).){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$/
}
}
Action {
id: goAction
shortcut: "Enter"
enabled: ipInput.acceptableInput
onTriggered: {
console.log("good")
}
}
Button {
id: go
width: 400
height: 40
text: "GO"
action: goAction
}
Button {
id: go2
width: 400
height: 40
text: "GO2"
action: goAction
}
}
}