Кнопка отключения QML после другого события button_click и повторное включение после тайм-аута - PullRequest
0 голосов
/ 04 октября 2019

Я бы отключил кнопку после другого события button_click и включил бы снова после тайм-аута таймера. Я пытался с Timer и States с PropertyChanged, но это не работает. Как я могу отправить сигнал qml для перезагрузки / обновления страницы?

Когда я нажимаю на id_button_add, я отключаю Id_button_edit и запускаю таймер на 3 секунды. Когда таймеры истекают, я уже включаю id_button_edit.

Вот мой код.

import QtQuick 2.0
import QtQuick.Layouts 1.3

import "../items"
import ch.example 1.0

Item {
id: id_root
z: 2

property bool prepare_delete: false
property string button_edit_enable_state: "enabled"

anchors.left: parent ? parent.left : undefined
anchors.right: parent ? parent.right : undefined

Connections {
    target: id_root.ListView.view
    onCurrentIndexChanged: {
        prepare_delete = false
    }
}

function update_remove_enable() {
    id_button_remove.button_enabled = ui_resident_model.sourceModel.rowCount() > 1
}

Component.onCompleted: {
    ui_resident_model.sourceModel.onRowsInserted.connect(update_remove_enable)
    ui_resident_model.sourceModel.onRowsRemoved.connect(update_remove_enable)
    update_remove_enable()
}

Rectangle {
    anchors.fill: parent

    color: "transparent"
    border {
        color: touchpanel_style.foreground_color
        width: touchpanel_style.line_width
    }
}

RowLayout {
    anchors.left: parent.left
    anchors.margins: touchpanel_style.margin
    anchors.verticalCenter: parent.verticalCenter

    .
    .
    .
    .
}

RowLayout {
    id: id_content
    anchors.right: parent.right
    anchors.margins: touchpanel_style.margin
    anchors.verticalCenter: parent.verticalCenter

    state: button_edit_enable_state

    states: [
        State {
            name: "enabled"
            PropertyChanges { target: id_button_edit; enabled: true }
        },
        State {
            name: "disabled"
            PropertyChanges { target: id_button_edit; enabled: false }
        }
    ]

    Timer {
        id: serviceListItemTimer
        interval: 3000
        running: false
        repeat: false
        onTriggered: {
            console.log("onTriggered")
            button_edit_enable_state = "enabled"
        }
    }

    IconButton {
        id: id_button_edit
        objectName: "button_edit"
        Layout.fillHeight: true
        width: height

        icon_factor: 1.35
        icon_source: "../icons/edit.png"

        onButtonClick: {
            prepare_delete = false
            loader.source = "../service_menu/ResidentEdit.qml";
            loader.item.onCancel.connect(cancel_edit)
            loader.item.onTimeout.connect(timeout)
            loader.item.model = id_root.ListView.view.currentItem.resident_model
        }

        function cancel_edit() {
            loader.source = ""
        }
    }

    IconButton {
        id: id_button_add
        objectName: "button_add"
        Layout.fillHeight: true
        width: height

        icon_factor: 1.35
        icon_source: "../icons/resident_add.svg"

        onButtonClick: {
            console.log("btn_add")
            button_edit_enable_state = "disabled"
            serviceListItemTimer.running = true
            var index = id_root.ListView.view.currentIndex;
            id_root.ListView.view.model.createItem(index);
            set_index(index);
        }
    }
}

}

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Если вы используете enabled свойство элемента, вы можете отключить кнопку.

Например:

IconButton {
        id: id_button_edit
        ...
        enabled: true
        ...
        onButtonClick: {
           id_button_edit.enabled = false;
           ...
        }

После истечения таймера вы возвращаетесь, чтобы активировать кнопку сid_button_edit.enabled = true.

Может быть, другим сигналом может быть другое решение.

Более подробная информация: https://doc.qt.io/qt-5/qtqml-syntax-signals.html

0 голосов
/ 05 октября 2019

Я нашел решение -> связать свойство qml с моделью cpp и создать также в сигнале valueChanged () модуля cpp. см http://imaginativethinking.ca/bi-directional-data-binding-qt-quick/

0 голосов
/ 04 октября 2019

Вы можете сделать это простым декларативным способом, связав свойство enabled вашей кнопки редактирования со свойством running таймера, не нужно иметь дело с состояниями и тому подобное:

IconButton {
    id: id_button_add
    // ...
    onButtonClick: {
        serviceListItemTimer.start();
        var index = id_root.ListView.view.currentIndex;
        id_root.ListView.view.model.createItem(index);
        set_index(index);
    }
}

IconButton {
    id: id_button_edit
    enabled: !serviceListItemTimer.running
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...