【问题标题】:QML - SpinBox - how to know if it's UP or DOWN pressedQML - SpinBox - 如何知道它是按下还是按下
【发布时间】:2021-03-18 14:26:18
【问题描述】:

我正在尝试在 QML 中创建自定义 CustomSpinBox,并且我想根据要按下的按钮来增加或减少 stepSize 的值。例如,如果我按下 UP 按钮,我想将值增加 X,如果我按下 DOWN 按钮,我想将值减少 Y。

我知道up.presseddown.pressed,但它们只是属性,我怎样才能在stepSize 函数中获取它们的值?

CustomSpinBox.qml

CustomSpinBox{
....
}

用法:

CustomSpinBox{
    id: maximumSpeed


    maximumValue: 100
    minimumValue: 0.01
    suffix: " " + qsTr("m/s")
    decimals: 3
    value: connection && connection.maxSpeed.value > 0 ? connection.maxSpeed.value : 1.5
    enabled: idOverrideDefault.checked

    stepSize: {
        // if UP is pressed return UP_VALUE
        // if DOWN is pressed return DOWN_VALUE
    }

    onValueChanged: {
        if (connection) {
            editor.handleSpeedRestriction(idOverrideDefault.checked, value)
        }
    }
}

更新:

好吧,我有一个数字,例如 1。如果你按下 UP 按钮会变成 2、3、4 等等。但是,如果您按下 DOWN 按钮,它将变为 0.9, 0.8, 0.7 .... 0.1 如果您再次按下 DOWN 按钮,它将变为 0.09, 0.08, ... 0.01。我的问题是我不知道如何在不知道是向上还是向下的情况下实现这样的目标。

我的意思是,例如,如果我的值为 1,我希望如果我按下 UP,我的 stepSize 为 1,但如果我按下 DOWN 为 0.1 如果我的值为 0.1,则相同,如果我按 UP,那么我的 stepSize 应该是 0.1,但如果我按 DOWN,应该是 0.01。

由于这个问题,我需要知道每次按下哪个按钮。

另外,如果我想写 maximumSpeed.up.pressed 会给我这个错误信息:Cannot read property 'pressed' of undefined 此外,如果我要定义 CustomSpinBox 的属性内部人员,例如像这样的 property bool isUp: root.up.pressed,那么这将永远不会更新,所以我将永远有一个 false 在那里。

【问题讨论】:

  • 我认为根据按下的按钮更改stepSize 不会起作用。我希望当你更新它的值时,增加/减少函数已经被调用了。或者至少,您将无法依赖事件的顺序。我认为您将需要创建自己的按钮并手动告诉他们按下它们时要做什么。
  • 有没有办法让我在 stepSize 函数中获得按下了哪个按钮?
  • 类似的东西:property var someValue: down.pressed ? -1 : (up.pressed ? 1 : 0)?
  • 这是个好主意,除了... 我如何更新我的属性?我的意思是,如果我要说这样的话,它将始终是false,因为它将被初始化一次并且永远不会更新。在这种情况下,我该如何更新?
  • 我找不到像 up.onPressed 这样的东西

标签: qt qml qspinbox spinbox


【解决方案1】:

你应该使用属性组语法:

SpinBox
{
    property bool isUpPressed: up.pressed
    property bool isDownPresed: down.pressed

    up.onPressedChanged: {
        isUpPressed = up.pressed
    }
    down.onPressedChanged: {
        isDownPresed = down.pressed
    }
}

对于 Quick.Controls 1. 在 up 和 down 不可用的地方,可以使用这个技巧:

   SpinBox
    {
        property int oldValue: -1
      
        onValueChanged: {
            if (value > oldValue)
            {
                console.log("up")
            }
            else
            {
                console.log("down")
            }
            oldValue = value
        }
    }

【讨论】:

  • 这不起作用,如果我尝试将此代码添加到我的 SpinBox 项目中,则会收到以下错误消息。 Cannot assign to non-existent property "down" down.onPressedChanged: {
  • 我也遇到了同样的错误up不仅down
  • 您使用的是哪个 qt 版本?以及如何在 qml 中导入控件?你能用“import QtQuick.Controls 2.0”试试我的回答吗
  • 关于 QT 版本是 5.14.2,关于 QtQuick 我使用的是 1.4。如果要使用 2.0,我有一个问题是无法识别 style 属性并且收到错误 Cannot assign to non-existent property "style" style: SpinBoxStyle {
  • 而我刚刚发现QtQuick.Controls 2.0中没有该样式。这种情况我该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多