由附加操作阻止的QML小部件的已启用属性

时间:2015-12-05 16:06:50

标签: qml qt5 qtquick2 qtquickcontrols

我希望在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始终被禁用。我怎么解决它?

1 个答案:

答案 0 :(得分:1)

Action通过同步绑定到的所有Item的状态来工作。文档说:

  

在应用程序中,可以通过菜单,工具栏按钮和键盘快捷键调用许多常用命令。由于用户希望以相同的方式执行每个命令,因此无论使用何种用户界面,将每个命令表示为操作都很有用。

     

操作可以绑定到菜单项和工具栏按钮,它会自动保持同步。例如,在文字处理器中,如果用户按下粗体工具栏按钮,将自动检查粗体菜单项。

从这个意义上说,Action属性规则它所绑定的Item的属性,而不是相反。启用Action后,所有它所连接的Item也会启用。因此,启用条件应移至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
        }
    }
}