Из числового счетчика, как запретить пользователю вводить числа в QML

Имея SpinBox, который должен всегда иметь числа, которые могут изменяться от минимального значения до максимального значения, как мы можем запретить пользователю из редактируемого счетчика удалять числа на нем, и результат превращается в пустой значение, как мы можем видеть в верхнем SpinBox:

введите здесь описание изображения

Я хочу, чтобы это не происходило на спинбоксе следующего типа:

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

Я уже пробовал много свойств, и ни одно из них не работает.


person Ngranja1512    schedule 22.08.2019    source источник
comment
как мы можем запретить пользователю из редактируемого счетчика удалять числа на нем, и результат превращается в это. Я не понимаю этот вопрос - значение на изображении, которое вы показываете, находится в допустимом диапазоне от 1 до 100. Я думаю было бы лучше, если бы вы показали изображение результата, которого вы пытаетесь избежать.   -  person Mitch    schedule 22.08.2019
comment
Постарайтесь быть более конкретным.   -  person Luka    schedule 23.08.2019
comment
@ Лука, да, фраза сбивает с толку. Я имел в виду, что верхний счетчик имеет пустое значение, я не хочу, чтобы это произошло, но все же я хочу, чтобы счетчик можно было редактировать, чтобы пользователь мог написать желаемое число, но если он ничего не пишет, я хочу, чтобы отображалось значение по умолчанию.   -  person Ngranja1512    schedule 23.08.2019
comment
Как насчет того, чтобы позволить пользователю стереть число из счетчика, но как только фокус изменится на какой-либо другой элемент управления, значение счетчика должно быть проверено. Если содержимое недействительно, вы можете записать последнее допустимое значение.   -  person Ponzifex    schedule 25.08.2019
comment
Привет @Ponzifex, как это можно сделать в qml?   -  person Ngranja1512    schedule 27.08.2019
comment
@ Ngranja1512, я создал ответ, чтобы решить вашу проблему.   -  person Ponzifex    schedule 28.08.2019


Ответы (2)


Похоже, вы нашли ошибку 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
        }
    }
}
person Ponzifex    schedule 28.08.2019

Я думаю, вы пытаетесь отключить ввод. См. «редактируемый»: https://doc.qt.io/qt-5/qml-qtquick-controls2-spinbox.html

person Luka    schedule 23.08.2019