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); } } }
}
3 Réponses :
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
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 // ... }
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 ...
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 /
fournir un exemple reproductible minimal