setItemDelegate wird nur für eine Spalte ausgeführt
Verfasst: Montag 20. März 2017, 17:31
Hallo!
So langsam verzweifel ich ein wenig an QT.
Ich habe folgendes gemacht. Um zu verhindern, das falsche Werte in Zellen eingefügt werden können habe ich zwei Delegate Klassen erstellt. Diese sollen einmal sollen nur Datumswerte und Währungswerte als Eingabe zulassen. Dass das regex evtl noch verfeinert werden muss, steht auf einem anderen Blatt.
In der aktuellen Konstellation wird die Falscheingabe des Rechnungswertes verhindert aber die der beiden Daten zugelassen
Die Tabelle ist wie folgt aufgebaut:
Rechnungsdatum|Rechnungsbetrag|Bezahlt|Zahldatum
Nun habe ich diese unten stehenden Klassen mit folgenden Code eingebunden:
In diesem Fall wird nur der Geldwert geprüft
Mein Problem ist, dass nur die Klasse Anwendung findet, die als letztes eingebunden wurde. Dreh ich die Anweisung um, werden die beiden Daten geprüft jedoch nicht der Geldbetrag. Wie kann ich beide Klassen auf die Tabelle anwenden?
Ich hatte dann noch Versuch, alles in eine Klasse zu packen:
Aber auch hier wird nur das die Eingabe des Geldes geprüft aber nicht das Datum
VG niesel
So langsam verzweifel ich ein wenig an QT.
Ich habe folgendes gemacht. Um zu verhindern, das falsche Werte in Zellen eingefügt werden können habe ich zwei Delegate Klassen erstellt. Diese sollen einmal sollen nur Datumswerte und Währungswerte als Eingabe zulassen. Dass das regex evtl noch verfeinert werden muss, steht auf einem anderen Blatt.
In der aktuellen Konstellation wird die Falscheingabe des Rechnungswertes verhindert aber die der beiden Daten zugelassen
Die Tabelle ist wie folgt aufgebaut:
Rechnungsdatum|Rechnungsbetrag|Bezahlt|Zahldatum
Code: Alles auswählen
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class ValidatedCurrencyItemDelegate(QStyledItemDelegate):
def createEditor(self, widget, option, index):
if not index.isValid():
return 0
if index.column() == 1:
print("ValidatedCurrencyItemDelegate")
editor = QLineEdit(widget)
# Todo
# Regex wegen eingaben wie 23,...,,,... verbessern
validator = QRegExpValidator(QRegExp("\d+(\,|\.)*\d{0,2}"), editor)
editor.setValidator(validator)
return editor
return super(ValidatedCurrencyItemDelegate, self).createEditor(widget, option, index)
class ValidatedDateItemDelegate(QStyledItemDelegate):
def createEditor(self, widget, option, index):
if not index.isValid():
return 0
if index.column() == 0 or index.column() == 3: #only on the cells in the first column
print("ValidatedDateItemDelegate")
editor = QLineEdit(widget)
validator = QRegExpValidator(QRegExp("\d{1,2}\.\d{1,2}.\d{4}"), editor)
editor.setValidator(validator)
return editor
return super(ValidatedDateItemDelegate, self).createEditor(widget, option, index)
In diesem Fall wird nur der Geldwert geprüft
Code: Alles auswählen
model = TableModel(my_array)
model.setHeaderData(0, QtCore.Qt.Horizontal, "Test")
self.dataTBL.setModel(model)
self.dataTBL.setItemDelegateForColumn(2, CheckBoxDelegate(self.dataTBL))
self.dataTBL.setItemDelegate(ValidatedDateItemDelegate()) #Datums überprüfung
self.dataTBL.setItemDelegate(ValidatedCurrencyItemDelegate()) #Geldbetragspüberprüfung
self.theSelectionModel = self.dataTBL.selectionModel()
Ich hatte dann noch Versuch, alles in eine Klasse zu packen:
Code: Alles auswählen
class ValidateItems(QStyledItemDelegate):
def createEditor(self, widget, option, index):
if not index.isValid():
return 0
if index.column() == 1:
editor = QLineEdit(widget)
validator = QRegExpValidator(QRegExp("\d+(\,|\.)*\d{0,2}"), editor)
editor.setValidator(validator)
return editor
elif index.column() == 0 or index.column() == 3:
editor = QLineEdit(widget)
validator = QRegExpValidator(QRegExp("\d{1,2}\.\d{1,2}.\d{4}"), editor)
return editor
return super(ValidateItems, self).createEditor(widget, option, index)
VG niesel