@Alle: Dieses Verhalten ist kein Fehler, sondern Feature, und im Übrigen auch
dokumentiert. Nur hat hier offenbar niemand die Dokumentation gelesen. Der Sinn von "QIntValidator" ist
nicht, einfach nur Ziffern als Eingabe zu akzeptieren. Das wäre trivial (siehe Ende dieses Beitrags). "QIntValidator" ermöglicht eine den Spracheinstellungen entsprechende Eingabe von Zahlen, und mithin auch Tausender-Trennzeichen.
Grundsätzlich kann man in "QIntValidator" dabei sowohl das den Spracheinstellungen entsprechende Eingabeformat nutzen also auch dasjenige der Standard-C-Lokalisierung:
[...] QIntValidator uses its locale() to interpret the number. For example, in Arabic locales, QIntValidator will accept Arabic digits. In addition, QIntValidator is always guaranteed to accept a number formatted according to the "C" locale.
Mithin kann man bei deutscher Spracheinstellung sowohl den Punkt als auch das Komma als Tausender-Trennzeichen nutzen, nicht aber beides gleichzeitig. Im ersten Fall parst Qt die Zeichenkette gemäß der deutschen Spracheinstellung, im letzteren Fall gemäß den Regeln der POSIX-Lokalisierung.
Fehlerhaft platzierte Tausender-Trennzeichen werden in "QIntValidator.fixup()" wieder entfernt, damit die Eingabe als Zahl geparst werden kann. Anders ließe sich eine Eingabe von Zahlen mit Tausender-Trennzeichen innerhalb der Möglichkeiten von "QValidator" gar nicht umsetzen, da man von vorne herein nie sicher sein kann, ob nun noch Ziffer nach dem Trennzeichen eingegeben werden oder nicht. Du kannst zwar von "QIntValidator" ableiten und ".fixup()" überschreiben, musst dann aber auch ".validate()" so verändern, dass "Invalid" zurückgegeben wird, wenn das Tausender-Trennzeichen an falscher Stelle steht. Das ist nicht trivial.
Zumal Dein Quelltext ohnehin fehlerhaft ist, da Du "int()" verwendest, um die validierte Eingabe zu parsen. "int()" ignoriert die Spracheinstellungen der Umgebung, die validierte Eingabe ist aber abhängig von der Lokalisierung. Wenn Du "QIntValidator" verwendest, musst Du die Eingabe mit "QLocale" parsen.
In Deinem Fall bist Du allerdings wohl besser bedient mit einem eigenen, ziemlich trivialen "QValidator":
Code: Alles auswählen
class StrictIntValidator(QValidator):
def __init__(self, min, max, parent=None):
QValidator.__init__(self, parent)
self.min = min
self.max = max
def validate(self, input, pos):
try:
value = int(input.strip())
state = QValidator.Acceptable if self.min <= value <= self.max else QValidator.Invalid
return state, input, pos
except ValueError:
return QValidator.Invalid