【问题标题】:QML disable button after other button_click event and enable again after timer timeoutQML 在其他 button_click 事件后禁用按钮并在计时器超时后再次启用
【发布时间】:2019-10-03 22:14:56
【问题描述】:

我会在其他 button_click 事件后禁用按钮,并在计时器超时后再次启用。我尝试使用带有 PropertyChanged 的​​ Timer 和 States,但它不起作用。 如何发送 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);
        }
    }
}

}

【问题讨论】:

标签: qt qml


【解决方案1】:

如果使用项目的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

【讨论】:

    【解决方案2】:

    您可以通过将编辑按钮的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
        // ...
    }
    

    【讨论】:

    • 感谢您的回答。我尝试了所有这些可能性,但也不起作用。是否有可能我必须从 Cpp 模块发出信号,因为 QML 页面是绑定到 Cpp 模型的?这也是我发布几乎整个代码的原因,以显示绑定。
    • Cpp模块发出的信号会刷新页面...
    【解决方案3】:

    我找到了一个解决方案 --> 将 qml 属性与 cpp 模型绑定,并在 cpp 模块 valueChanged() 信号中发出。 见http://imaginativethinking.ca/bi-directional-data-binding-qt-quick/

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2012-06-11
      • 2021-04-02
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      相关资源
      最近更新 更多