Delegate für QTreeView funzt nicht mit QtDesigner-UI

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo zusammen,

ich brauche für ein kleines Projekt einen besonderen TreeView, in dem es u.a. für bestimmte Spalten und deren Werte eine ProgressBar als anzeigendes Element geben soll. Also habe ich mir mal eine kleine Demo-Applikation gebastelt, um mal zu testen, wie das mit so einem Delegate klappt.

Das ergebnis findet man hier:
http://paste.pocoo.org/show/144037/

Als ich das nun auf meine Applikation übertragen wollte, bekam ich immer ein Fehlermeldung dieser Art:

Code: Alles auswählen

Traceback (most recent call last):
  File "./progress_table_new.py", line 42, in paint
    progressBarOption, painter)
TypeError: insufficient number of arguments to KStyle.drawControl()
Ich war dann lange ratlos und habe den Code immer wieder geprüft. Schließlich kam ich auf die Idee, mal zu prüfen, ob das evtl. an der automatisch generierten GUI liegen könnte. Und Bingo: Ich habe mir ein simples Widget und einen TreeView da drin per Designer zusammengeklickt und anstelle des selbst erstellen TreeViews in meine Demoapplikation integriert (auskommentierte Zeile 51). Wenn man nun dieses als Basis für die GUI wählt, so tritt dieser Fehler auf.

Nun meine Frage: Was genau mache ich falsch bzw. wo dran kann das bitte schön liegen?

Hier noch der Paste für das UI File:
http://paste.pocoo.org/show/144039/

Ich hoffe jemand weiß einen Rat. Mit den beiden Files solltet Ihr das zumindest selber bei Euch prüfen können.
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Ist das Absicht?

Code: Alles auswählen

class ProgressDelegate(QtGui.QStyledItemDelegate):
    
    def __init__(self, parent = None):
        QtGui.QItemDelegate.__init__(self, parent)
Von QtGui.QStyledItemDelegate ableiten, dann aber das __init__ von QItemDelegate aufrufen?
Und wenn du das ui als Member haben willst, warum mit uic.loadUi? Kannst du das nicht gleich per pyuic4 kompilieren?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

franzf hat geschrieben:Ist das Absicht?

Code: Alles auswählen

class ProgressDelegate(QtGui.QStyledItemDelegate):
    
    def __init__(self, parent = None):
        QtGui.QItemDelegate.__init__(self, parent)
Von QtGui.QStyledItemDelegate ableiten, dann aber das __init__ von QItemDelegate aufrufen?
Ja, hab ich sofort mal korrigiert. Hatte die Klasse später geändert und den Aufruf von __init__ dann vergessen anzupassen.
Und wenn du das ui als Member haben willst, warum mit uic.loadUi? Kannst du das nicht gleich per pyuic4 kompilieren?
Wozu den Umstand machen?

Hast Du es denn evtl. mal bei Dir getestet?
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Ich hab es jetzt mal getestet, und auch die Lösung für dich.
Das Problem scheint in KStyle zu liegen. QStyle definiert den letzten Parameter mit einem Default-Value von "None", also in C++ ein nullptr.
http://www.riverbankcomputing.co.uk/sta ... rawControl
KStyle hingegen gibt dem Widget keinen Default-Value:
http://api.kde.org/pykde-4.2-api/kdeui/ ... 3070561836
Da du an der Stelle kein Widget hast, auf das du zeichnen solltest, musst du einfach noch ein "None" mitgeben:

Code: Alles auswählen

QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_ProgressBar,
                                            progressBarOption, painter, None)
Und schon gehts auch mit kde :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hey, danke! :-) Lass mich Deine Füße küssen :-D

Mir fiel gerade selber auf, dass das KStyle steht. Ich frage mich nur: Wieso? Ich arbeite zwar unter KDE, habe ja aber keine K-Klassen eingebunden... könnte das am QtDesigner liegen? (Wobei ich auch dort nur mit den Qt-Widget-Elementen gearbeitet habe).

Auf jeden Fall läuft es damit. Danke noch mal!
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Du arbeitest unter KDE, und hast wahrscheinlich Oxygen am Start. Das jedenfall ist der einzige Style, der bei mir das Verhalten zeigt.
In jedem Fall ist es ein Style, der von KStyle erbt. Und, naja, KStyle kennt nur die Variante mit ohne Default-None für das Widget, auch wenn QApplication.style() erstmal nur ein QStyle-Objekt zurückliefert.
Du hast ja deinen Style global gesetzt. Drum wird er auch verwendet, ob du jetzt kde-Klassen verwendest oder nicht.

In jedem Fall läufts jetzt, das ist das wichtigste :)

Grüße
Franz
Antworten