QSqlQueryModel - Vertical HeaderData

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Hallo,


Ich möchte gerne bei meiner Tabelle (TableView) das die Zeilenbeschriftung nicht 1 2 3 4 5 ist, sondern das die erste Spalte als Beschriftung dient.
Die erste Spalte enthält Daten als String (Datum)

Leider unterstützt QSqlQueryModel anscheinend nicht.
self.setHeaderData(int, QtCore.Qt.Vertical, QtCore.QVariant(value))
sondern nur
self.setHeaderData(int, QtCore.Qt.Horizontal, QtCore.QVariant(value))

Gibt es eine Möglichkeit das umzuändern?

lg,
...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Die Antwort, warum das so ist und die Lösung findest Du hier:

http://www.qtforum.de/forum/viewtopic.php?t=10245
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Verzeih mir, aber ich versteh das nicht.
Wie auch Troll.Soft kann ich (ok - mit beschränktem Englisch, und noch beschränkteren C-Kenntnissen) nicht den Grund ersehen, wesshalb mich Qt nicht an die Verticalen Header ran lässt.

Da wird davon geredet, die Classe abzuleiten, und headerData() selbst zu implementieren.

Ableiten = Eigene Class schreiben, die davon erbt(

Code: Alles auswählen

class meinSql(QtSql.QSqlQueryModel):
...
) ?

Und wie kann ich dann headerData() neu implementieren?
Ich weiß ja nicht, was da alles drin stehen muss.
Einfach self.headerData = QAbstractItemModel.headerData() funktioniert ja nicht, oder?


lg,
...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

So zum Beispiel (ungetestet):

Code: Alles auswählen

from PyQt4.QtSql import QSqlQueryModel
from PyQt4.QtCore import Qt, QVariant

class MySqlQueryModel(QSqlQueryModel):
    def __init__(self, *args, **kwargs):
        QSqlQueryModel.__init__(self, *args, **kwargs)
        self._verticalHeader = {}

    def setHeaderData(self, section, orientation, value):
        if orientation == Qt.Vertical:
            self._verticalHeader[section] = value
            return True
        return QSqlQueryModel.setHeaderData(self, section, orientation, value)

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if orientation == Qt.Vertical:
            content = self._verticalHeader.get(section)
            if content:
                #return QVariant(content)
                return content
        return QSqlQueryModel.headerData(self, section, orientation, role)
Für den View ist nur die headerData()-Methode wichtig. Du musst hier auch nicht alles reimplementieren, sondern schiebst ihm einfach für die gewünschten Änderungen Deine Werte unter, während alles andere normal von QSqlQueryModel() verarbeitet wird.
Die Rückgabe von `content` als QVariant() habe ich als Sicherheit eingebaut, da Qt hier diesen Typ erwartet. (Ist vllt. nicht mehr nötig, da mit neueren PyQt-Versionen das Zusammenspiel von Pythontypen mit Qt vereinfacht wurde.)-->Änderung: Muss schon als QVariant() mit setHeaderData() übergeben werden und kann deshalb raus.
`setHeaderData()` prüft eigentlich noch die Gültigkeit einer angefragten Sektion für horizontal und gibt `False` zurück für ungültige Werte. Falls Du das Verhalten auch für vertikale Werte wünschst, müsstest Du halt noch eine Wertebereichsprüfung vorschalten.

Edit:
Das hab ich ganz vergessen, Du kannst auch den View modifizieren, indem Du ihm ein separates QHeaderView unterschiebst.

Grüße, jerch
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Vielen dank...

Nach dem ich lange nicht ganz verstanden habe, wie die Funktionsweise von dem ist, was du schriebst, ist bei mir, gerade als ich blöd nachfragen wollte, der Groschen gefallen, wie das Funktioniert...


Danke.
Antworten