QTableview und beibehalten von Wert bei Fehlerhaften eingabe

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 Zusammen,

ich habe das unten stehende Tabellenmodel in der ein in der zweiten Spalte Geldwerte dargestellt werden sollen. Das heißt, die Daten werden als Integerwert in der DB gespeichert. Damit der Wert in der Tabelle schön als Währungswert ausgegeben wird aber ich folgende Formatierungfunktion geschrieben

Code: Alles auswählen

class Currency:
    def get_Curr_format(self, value):
        value = value.replace('€','').replace(',','.')
        value_f = float(value)
        c = "{p:8.2f}".format(p=value_f)
        #print(c)
        return c

Diese führe ich mit der Zeile

Code: Alles auswählen

value = str(curr_format.get_Curr_format(value)).replace('.',',') + " €"  
aus.

Nun möchte aber verhindern, dass falsche Werte wie Buchstaben o.Ä. eingebenb werden können. Dazu war die Idee, einfach mit einer Exception eine Fehlermeldung auszugeben und den alten Wert wieder in die Zelle zu schreiben (tmp_value). Das ist mir bisher noch nicht gelungen.

Liegt der Fehler darin, dass ich das in der Displayrole versuche. Was muss ich tun, damit dieser Wert beim Fehlerfall eingetragen wird?

Code: Alles auswählen

from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5 import Qt
from FormatTools.Currency import *



class TableModel(QtCore.QAbstractTableModel):
    ...

        def data(self, index, role):
        curr_format = Currency()
        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            print(self._data[row][column])
            print(type(self._data[row][column]))
            if column == 1:
                value = self._data[row][column].replace('.', ',')
                return value
            return self._data[row][column]
        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            column = index.column()
            value = self._data[row][column]
            value_tmp = self._data[row][column]
            if column == 1:
                try:
                    value = str(curr_format.get_Curr_format(value)).replace('.',',') + " €"
                    return value
                except ValueError as e:
                    return value_tmp #alten Wert der Zelle bei Fehlerfall zurückgeben
                    print("Value Error: ", e)
            return value
        if role == QtCore.Qt.CheckStateRole:
            column = index.column
            if column == 2:
                return Qt.QCheckBox

VG niesel
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo zusammen,

ich habe das Problem anders gelöst:

der Nutzer wird gezwungen nur Daten richtigen Format eingeben zu können:

Code: Alles auswählen

class ValidatedCurrencyItemDelegate(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) # z.B 2312312323,4 oder  2312312323.40
            editor.setValidator(validator)
            return editor
        return super(ValidatedCurrencyItemDelegate, self).createEditor(widget, option, index)

Code: Alles auswählen


 self.dataTBL.setItemDelegate(ValidatedCurrencyItemDelegate()) #Zuweisen des Editors für die Tabelle
VG niesel
BlackJack

@nieselfriem: '42,.,,...,.,,,,23' wäre also eine gültige Eingabe? ;-)
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Ups, äh...., Natürlich ;)

Danke für den Hinweis
Antworten