Tabelle nach Aenderungen aktualisieren

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
devent
User
Beiträge: 2
Registriert: Donnerstag 9. Juli 2009, 19:06

Hallo,
ich bin rel. neu zu Python und Qt4 (mein erstes Project damit ist 3 Wochen her). Ich habe ein vollgendes Problem.

Aus einer anderen Bibliothek bekomme ich eine map/list von Werten, die ich in einem QTableView darstellen will. Diese externe Bibliothek verwendet die map/list und liefert mir (nach neuen Berechnungen) eine veraederte map/list.

Nun muss ich das ganze in einem QTableView darstellen. Dazu habe ich mir die vollgende Klasse geschrieben:

Code: Alles auswählen

class FractionModel(QtCore.QAbstractTableModel):

    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self._log = logging.getLogger(_LOGGER_NAME)
        self._fraction = Gscalc.Fraction()

    def getFraction(self):
        return self._fraction

    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self._fraction)
    
    def columnCount(self, parent=QtCore.QModelIndex()):
        return self.COLUMN_COUNT
    
    def data(self, index, role=QtCore.Qt.DisplayRole):
        if role != QtCore.Qt.DisplayRole:
            return QtCore.QVariant()

        if index.column() == self.COLUMN_LEVEL:
            return QtCore.QVariant(index.row())
        elif index.column() == self.COLUMN_MIN:
            return QtCore.QVariant(self._fraction[index.row()].min)
        elif index.column() == self.COLUMN_MAX:
            return QtCore.QVariant(self._fraction[index.row()].max)
        else:
            return QtCore.QVariant()
            
    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
        if role != QtCore.Qt.DisplayRole:
            return QtCore.QVariant()

        if orientation == QtCore.Qt.Horizontal:
            return QtCore.QVariant(self.COLUMNS_NAMES[section])
        if orientation == QtCore.Qt.Vertical:
            return QtCore.QVariant()

    def flags(self, index):
        return self.COLUMN_FLAGS[index.column()]

    def setData(self, index, value, role=QtCore.Qt.EditRole):
        if role != QtCore.Qt.EditRole:
            return False

        if not value.canConvert(QtCore.QVariant.Double):
            return False
        
        v = value.toPyObject()
        row = index.row()
        column = index.column()
        
        if column == self.COLUMN_MIN:
            self._fraction[row].min = float(v) 
            self._fraction[row].vmin = float(v)
        elif column == self.COLUMN_MAX:
            self._fraction[row].max = float(v) 
            self._fraction[row].vmax = float(v)

        self._log.debug(
            'set new value for denominator #{0:d}: {1!s}'
                .format(row, self._fraction[row]))

        return True
Wie soll ich nun die QTableView dazu veranlassen, die neuen Daten darzustellen? Ich habe das so probiert:

Code: Alles auswählen

    def updateFractionTable(self):
        n1 = self.index(0, 0, QtCore.QModelIndex())
        n2 = self.index(self.rowCount(), self.columnCount(), QtCore.QModelIndex())
        self.emit(QtCore.SIGNAL('dataChanged'), n1, n2)
Auch mit:

Code: Alles auswählen

table.emit(QtCore.SIGNAL('update'))
Aber das ganze funktioniert nicht. Welche Methode verwendet den Qt4?

Danke, devent.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Schau mal ins Find Files Beispiel in der QT4 Doku. Das ist zwar C++, aber die verwendeten Methoden erkennt man ja ganz gut wieder. :)
devent
User
Beiträge: 2
Registriert: Donnerstag 9. Juli 2009, 19:06

Danke, aber in dem Beispiel wird das Model benutzt um neue Zeilen einzufuegen und zu befuellen. Aber ich habe ja schon alle Daten, ich brauche nur eine Methode, die sagt dass das View aktuallisiert werden muss.

Ich bekomme ja schon alle Daten aus der anderen Bibliothek und meine Model-Klasse macht nichts anderes als diese Daten ueber das Interface von QAbstractTableModel an das Table-View zu liefern. Nun muss ich doch nur das View aktualliesen, wenn neue Daten bereitliegen.

In Java macht man das z.B. ueber die Methode fireTableRowsInserted(int firstRow, int lastRow) und fireTableRowsUpdated(int firstRow, int lastRow).

Kann man den in Qt neue Daten nur ueber das Model einfuegen/veraendern, damit auch das View aktuallisiert wird? Dann muss ich aber die Daten sozusagen doppelt verwalten.
Antworten