1
votes

Bouton de désactivation QML après un autre événement button_click et réactiver après le délai d'expiration du minuteur

Je désactiverais le bouton après un autre événement button_click et le réactiverais après l'expiration du délai. J'ai essayé avec Timer et States avec PropertyChanged, mais cela ne fonctionne pas. Comment puis-je envoyer un signal qml pour recharger / actualiser la page?

Quand je clique sur id_button_add, je désactive Id_button_edit et démarre un minuteur pendant 3 secondes. Lorsque la minuterie expire, j'active déjà le id_button_edit.

Voici mon code.

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);
        }
    }
}

}


1 commentaires

3 Réponses :


2
votes

Si vous utilisez la propriété enabled de l'élément, vous pouvez désactiver le bouton.

Par exemple:

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

Ensuite, le minuteur expire , vous revenez pour activer le bouton avec id_button_edit.enabled = true .

Peut-être qu'une autre solution peut être le signal.

Voici plus d'informations: https://doc.qt.io/qt-5/qtqml- syntax-signaux.html


0 commentaires

0
votes

Vous pouvez le faire de manière simple et déclarative en liant la propriété enabled de votre bouton d'édition à la propriété running de la minuterie, pas besoin de traiter les états et tel:

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
    // ...
}


2 commentaires

Merci pour les réponses. J'ai essayé toutes ces possibilités, mais cela ne fonctionne pas trop. Est-il possible que je doive émettre un signal du module Cpp parce que la page QML est liée à un modèle Cpp? C'est aussi la raison pour laquelle j'ai posté presque tout le code, afin de montrer la liaison.


Le signal émis par le module Cpp va alors rafraîchir la page ...



0
votes

J'ai trouvé une solution -> lier la propriété qml avec le modèle cpp et émettre également dans le signal valueChanged () du module cpp. voir http://imaginativethinking.ca/bi-directional-data-binding- qt-quick /


0 commentaires