【问题标题】:From a numerical spinbox how to prevent the user from typing no numbers in QML从数字旋转框中如何防止用户在 QML 中不输入数字
【发布时间】:2019-08-28 21:58:00
【问题描述】:

有一个 SpinBox 应该总是有可以从最小值到最大值的数字,我们如何防止用户从可编辑的 spinbox 删除上面的数字,结果变成 值,就像我们在顶部看到的SpinBox

我希望防止这种情况发生在以下类型的旋转框上:

SpinBox {
editable: true
from:1
to:100
}

我已经尝试了很多属性,但它们似乎都不起作用。

【问题讨论】:

  • “我们如何防止用户从可编辑的旋转框删除上面的数字,结果变成这个”我不明白这个问题 - 你显示的图像中的值在1 到 100 的有效范围。我认为如果您显示您试图避免的结果的图像会更好。
  • 尽量具体一点。
  • @Luka 是的,这句话令人困惑。我的意思是顶部的旋转框有一个空值,我不希望这种情况发生,但我仍然希望旋转框可编辑,以便用户可以写出他想要的数字,但如果他什么都不写,我希望出现默认值
  • 让用户从旋转框中删除数字怎么样,但是一旦焦点更改为其他控件,就应该验证旋转框的值。如果内容无效,您可以写回最后一个有效值。
  • 嗨@Ponzifex 如何在 qml 中完成?

标签: qt qml


【解决方案1】:

您似乎发现了一个 QML 错误。 SpinBox 应该在 from-to 范围内验证其值,但并非每次都发生。这是一个粗略的解决方法,它涉及计时器并将值写入SpinBox,从而在没有活动焦点时强制一遍又一遍地验证其值。如果您有很多 SpinBox,您可以考虑增加计时器的间隔值以避免性能下降。

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("SpinBox bug workaround")

    function fixSpinBox(sb)
    {
        if(!sb.activeFocus) {
            var tmp = sb.value
            sb.value = sb.from
            sb.value = sb.to
            sb.value = tmp
        }
    }

    Timer {
        interval: 250; running: true; repeat: true
        onTriggered: {
            fixSpinBox(sb1)
            fixSpinBox(sb2)
        }
    }

    Column {
        SpinBox {
            id: sb1
            from: 1
            to: 100
            editable: true
        }
        SpinBox {
            id: sb2
            from: 1
            to: 100
            editable: true
        }
    }
}

【讨论】:

    【解决方案2】:

    我认为您正在尝试禁用输入。 见“可编辑”:https://doc.qt.io/qt-5/qml-qtquick-controls2-spinbox.html

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多