setItemDelegate wird nur für eine Spalte ausgeführt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

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

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)
Nun habe ich diese unten stehenden Klassen mit folgenden Code eingebunden:
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()
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:

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)
Aber auch hier wird nur das die Eingabe des Geldes geprüft aber nicht das Datum

VG niesel
BlackJack

@nieselfriem: Das letzte Beispiel ist es fast. Natürlich wird da nicht auf das Datum geprüft. Warum denkst Du sollte das der Fall sein? In welcher Zeile werden dort denn der Editor und der Validator zusammengebracht?
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

@Blackjack: Echt jetzt? :oops:
Oh man, manchmal ist man einfach nur betriebsblind. Ich fasse dann mal zusammen. setItemDelegate kann nur einmal mit einer Klasse auf eine Tabelle angewendet werden bzw. es wird immer die letzte Anweisung Anwendung finden.

Ich habe dein Hinweis beachtet und nun funktioniert es.

Vielen Dank

Grüße niesel
Antworten