Seite 1 von 1

Tabelle nach Aenderungen aktualisieren

Verfasst: Donnerstag 16. Juli 2009, 20:36
von devent
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.

Verfasst: Freitag 17. Juli 2009, 07:54
von mkesper
Schau mal ins Find Files Beispiel in der QT4 Doku. Das ist zwar C++, aber die verwendeten Methoden erkennt man ja ganz gut wieder. :)

Verfasst: Freitag 17. Juli 2009, 14:47
von devent
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.