Como a entrada TextField pode ser validada para inteiros longos?

1

Eu preciso que o usuário seja capaz de inserir um número inteiro, restrito a valores entre 0 e um limite superior. O limite superior é muito grande para caber dentro do tipo de dados 'int', então usei um tipo de dados 'real' com um DoubleValidator.

O DoubleValidator não restringe adequadamente o limite superior, enquanto um IntValidator com um valor int funciona conforme o esperado.

Exemplo do IntValidator

Isso restringe o texto digitado a valores inteiros entre 0 e 1000:

import QtQuick 2.0
import Ubuntu.Components 0.1

MainView {
    id: main
    width: 500
    height: 500

    TextField {
        id: tf
        text: "0"
        anchors.centerIn: parent
        validator: IntValidator {
            bottom: 0
            top: 1000
        }
    }

    property int value: 0+tf.text

    Label {
        id: label
        text: ""+main.value
    }

}

Exemplo do DoubleValidator

Isso restringe o texto digitado a valores inteiros (duplos com 0 casas decimais) e garante que o valor seja maior que ou igual a 0. No entanto, valores excedendo 1e10 são permitidos - ao contrário do que seria esperado.

import QtQuick 2.0
import Ubuntu.Components 0.1

MainView {
    id: main
    width: 500
    height: 500

    TextField {
        id: tf
        text: "0"
        anchors.centerIn: parent
        validator: DoubleValidator {
            bottom: 0
            top: 1e10
            decimals: 0
        }
    }

    property real value: 0+tf.text

    Label {
        id: label
        text: ""+main.value
    }

}

Por que isso não funciona como esperado?

Como a entrada de números inteiros longos pode ser validada?

    
por lazyteq 12.07.2013 / 18:54

1 resposta

1

Adicionar notation: DoubleValidator.StandardNotation ao DoubleValidator corrige o problema. De sua documentação:

  

Se a notação estiver definida como DoubleValidator.StandardNotation e a entrada   contém mais dígitos antes do ponto decimal do que um duplo no   intervalo válido pode ter, também é rejeitado. Se a notação for   DoubleValidator.ScientificNotation, e a entrada não está no valor válido   intervalo, é accecpted mas inválido. O valor pode ainda se tornar válido por   mudando o expoente.

    
por timp 17.07.2013 / 12:23