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