Topic: Come settare un Validatore per i dati inseriti tramite QlineEdit (PyQt5)  (Letto 152 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline SM

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo
Buongiorno a tutti ragazzi, sono alle prime armi con la programmazione in python.
Sto cercando di creare una interfaccia grafica tramite PyQt5.  Si tratta di una finestra che accetta in input 2 dati numerici e poi ne fà la somma, dopo aver cliccato su un tasto, visualizzando il risultato in una terza cella.  Quando eseguo il codice non ottengo nessun messaggio di errore e tutto funziona come mi aspetto.

Non riesco a capire come impostare un controllo sui dati immessi in una QLineEdit.

Sto utilizzando questa linea di codice e funziona correttamente (riesco ad immettere solo 5 numeri interi):

self.D_f.setValidator(QRegExpValidator(QRegExp("[0-9]\\d{1,4}"), self.D_f))

Quello che vorrei fare è questo:
- Accettare solo immissione di numeri con virgola.
- Inserire solo il carattere " . " anche se digito il tasto " , " da tastiera.
- Inserire un messaggio di errore (con controllo if presumo) se la cella è vuota (attualmente il programma si chiude quando eseguo una funzione collegata ad QPushButton e ci sono celle vuote)

Ragazzi, potete darmi una mano per favore? Ho cercato ovunque in rete!

Grazie in anticipo

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 336
  • Punti reputazione: 0
    • Mostra profilo
Purtroppo, non conosco per nulla le librerie qt, e molto poco in genere le GUI in python, ma mi ha intrigato la "espressione regolare", materia da sempre per me ostica che cerco di apprendere.
Con un po' di sbattimento ho definito una regex che sembra valutare correttamente l'input numerico, accettando virgole e punti quale separatore, te la propongo nel caso possa esserTi utile :
disc = re.compile(r'^-?\d+(?:[,.]\d*)?$')


mi son divertito a fare un po' di test con "sub" delle re e pare funzionare :

>>> str_in = '-12,345'
>>> str_out = re.sub(',', '.', str_in) if disc.match(str_in) else 'NONE'
>>> print(str_out)
-12.345
>>> str_in = '-12,.345'
>>> str_out = re.sub(',', '.', str_in) if disc.match(str_in) else 'NONE'
>>> print(str_out)
NONE
>>> str_in = '-12.345'
>>> str_out = re.sub(',', '.', str_in) if disc.match(str_in) else 'NONE'
>>> print(str_out)
-12.345
>>> str_in = '-12345'
>>> str_out = re.sub(',', '.', str_in) if disc.match(str_in) else 'NONE'
>>> print(str_out)
-12345
>>> str_in = '12345'
>>> str_out = re.sub(',', '.', str_in) if disc.match(str_in) else 'NONE'
>>> print(str_out)
12345
>>> str_in = '12a345'
>>> str_out = re.sub(',', '.', str_in) if disc.match(str_in) else 'NONE'
>>> print(str_out)
NONE
>>>


Suppongo che, forse, che QRegExpValidator possa essere sub-classato, ovvero possa essere utilizzato un generico QValidator con eventuali metodi associati per "ridefinire" l'input del controllo associato ... segnalo quanto sopra nel caso possa esserTi utile.

Ciao