qt - 如何防止 QML 按钮在短时间内多次点击?

标签 qt qml

我有一个 QML 按钮,我想防止在我的函数调用完成之前单击该按钮。
我尝试了下面的代码,但它不起作用。按钮不会在 clicked 中切换启用/禁用信号。我猜绑定(bind)不会立即生效。

import QtQuick
import QtQuick.Control

Button {
    onClicked: {
        console.log('clicked')
        this.enabled = false
        do_something()
        this.enabled = true
    }
}
我也试过pressed信号
Button {
    onPressed: {
        console.log('pressed')
        this.enabled = false
    }
    onClicked: {
        console.log('clicked')
        do_something()
        this.enabled = true
    }
}
但是 onClicked信号根本没有被触发。

最佳答案

如果 enabled属性绑定(bind)不起作用,您始终可以阻止自己调用您的函数:

Button {
    onClicked: {
        if (this.enabled) {  // Don't allow multiple clicks
            console.log('clicked')
            this.enabled = false
            do_something()
            this.enabled = true
        }
    }
}
更新:
为了回答您自己对问题的回答,我建议计时器的替代方法是 Qt.callLater() .它本质上将在事件队列上发布一个事件,而不是直接调用该函数。这为其他处理提供了足够的时间。
Button {
    id: btn
    onClicked: {
        console.log('clicked')
        this.enabled = false
        Qt.callLater(callback);
    }
    function callback() {
        do_something()
        btn.enabled = true
    }
}
但是我仍然想知道您是否曾经尝试过我的原始答案,因为我认为这要容易得多,而且应该可以。

关于qt - 如何防止 QML 按钮在短时间内多次点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65688478/

相关文章:

c++ - 具有两个不同 View 的 Qt 数据模型

qt - QML TextField 设置焦点突出显示颜色

qml - 我可以使用Qt quick UI 项目来开发一个真正的产品吗?

c++ - QML - 如何在 ListView 上显示文本文件?

javascript - 项目后面的 QML Shader Effect 模糊

c++ - 与排序模型一起使用时的 Qt TreeView 问题

qt - 编辑开始时更改 QStandardItem 的文本

c++ - 使用 QStyledItemDelegate 时 QPushButton 的绘制方法面临问题

c++ - QTreeView - 如何判断拖放事件是重新排序还是 parent 之间的移动?

qt - 更新数据时如何更新 QAbstractItemModel View