setItemDelegate wird nur für eine Spalte ausgeführt

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

setItemDelegate wird nur für eine Spalte ausgeführt

Beitragvon nieselfriem » 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

  1. from PyQt5.QtCore import *
  2. from PyQt5.QtGui import *
  3. from PyQt5.QtWidgets import *
  4.  
  5. class ValidatedCurrencyItemDelegate(QStyledItemDelegate):
  6.     def createEditor(self, widget, option, index):
  7.  
  8.         if not index.isValid():
  9.             return 0
  10.         if index.column() == 1:
  11.             print("ValidatedCurrencyItemDelegate")
  12.             editor = QLineEdit(widget)
  13.             # Todo
  14.             # Regex wegen eingaben wie 23,...,,,... verbessern
  15.             validator = QRegExpValidator(QRegExp("\d+(\,|\.)*\d{0,2}"), editor)
  16.             editor.setValidator(validator)
  17.             return editor
  18.         return super(ValidatedCurrencyItemDelegate, self).createEditor(widget, option, index)
  19.  
  20. class ValidatedDateItemDelegate(QStyledItemDelegate):
  21.  
  22.     def createEditor(self, widget, option, index):
  23.         if not index.isValid():
  24.             return 0
  25.         if index.column() == 0 or index.column() == 3: #only on the cells in the first column
  26.             print("ValidatedDateItemDelegate")
  27.             editor = QLineEdit(widget)
  28.             validator = QRegExpValidator(QRegExp("\d{1,2}\.\d{1,2}.\d{4}"), editor)
  29.             editor.setValidator(validator)
  30.             return editor
  31.         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
  1.         model = TableModel(my_array)
  2.         model.setHeaderData(0, QtCore.Qt.Horizontal, "Test")
  3.         self.dataTBL.setModel(model)
  4.         self.dataTBL.setItemDelegateForColumn(2, CheckBoxDelegate(self.dataTBL))
  5.         self.dataTBL.setItemDelegate(ValidatedDateItemDelegate()) #Datums überprüfung
  6.         self.dataTBL.setItemDelegate(ValidatedCurrencyItemDelegate()) #Geldbetragspüberprüfung
  7.         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:

  1. class ValidateItems(QStyledItemDelegate):
  2.     def createEditor(self, widget, option, index):
  3.         if not index.isValid():
  4.             return 0
  5.  
  6.         if index.column() == 1:
  7.             editor = QLineEdit(widget)
  8.             validator = QRegExpValidator(QRegExp("\d+(\,|\.)*\d{0,2}"), editor)
  9.             editor.setValidator(validator)
  10.             return editor
  11.         elif index.column() == 0 or index.column() == 3:
  12.             editor = QLineEdit(widget)
  13.             validator = QRegExpValidator(QRegExp("\d{1,2}\.\d{1,2}.\d{4}"), editor)
  14.             return editor
  15.         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
Benutzeravatar
BlackJack
Moderator
Beiträge: 32221
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: setItemDelegate wird nur für eine Spalte ausgeführt

Beitragvon BlackJack » Montag 20. März 2017, 17:37

@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?
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
Benutzeravatar
nieselfriem
User
Beiträge: 65
Registriert: Sonntag 13. Januar 2013, 16:00

Re: setItemDelegate wird nur für eine Spalte ausgeführt

Beitragvon nieselfriem » Montag 20. März 2017, 17:41

@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

Zurück zu „Qt/KDE“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder