Включенное свойство виджета QML, заблокированное прикрепленным действием

Я хочу включить кнопку, когда 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 всегда отключен. Как я могу это исправить?


person sweetSTEAM    schedule 05.12.2015    source источник


Ответы (1)


Action работает путем синхронизации состояния всех Item, к которым они привязаны. В документации говорится:

В приложениях многие общие команды можно вызывать с помощью меню, кнопок на панели инструментов и сочетаний клавиш. Поскольку пользователь ожидает, что каждая команда будет выполняться одинаково, независимо от используемого пользовательского интерфейса, полезно представить каждую команду как действие.

Действие можно связать с элементом меню и кнопкой на панели инструментов, и оно будет автоматически синхронизировать их. Например, в текстовом процессоре, если пользователь нажимает кнопку панели инструментов «Полужирный», пункт меню «Полужирный» будет автоматически выбран.

В этом смысле свойства Action управляют свойствами Item, с которыми они связаны, а не наоборот. Когда Action включен, также включаются все Item, к которым он подключен. Следовательно, разрешающее условие должно быть перемещено в Action.

Вот пересмотренная версия вашего кода. Я добавил еще один Button, чтобы подчеркнуть функциональность Action. Здесь оба Buttons автоматически включаются при выполнении условия, поскольку активируется соответствующий 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
        }
    }
}
person BaCaRoZzo    schedule 06.12.2015