Einfaches Beispiel für treeView mit pyQt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
MDGo88
User
Beiträge: 18
Registriert: Sonntag 20. September 2009, 13:39

Hallo zusammen,

vielleicht kann mir jemand helfen. Ich versuche gerade zu verstehen, wie man ein dialog mit einem treeView aufbaut. Leider finde ich wenn überhaupt nur komplizierte Beispiele, die entweder import Qt brauchen oder direkt mit jede Menge Overhead versehen sind, die das Verständnis dafür nicht erleichtern.
Daher bin ich auf der Suche nach einem ganz einfachen Beispiel, ohne rekursive Lösung oder so. Nur ein paar fix fest programmierte Daten, damit man den Weg nachvollziehen kann, das würde mir schon reichen

Wäre dankbar für jede Hilfe

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

Ich denke die Lösung hängt auch davon ab was in deinem Tree geviewt werden soll...

Was hast du dagegen, wenn du für die Verwendung von Qt auch Qt importest?
MDGo88
User
Beiträge: 18
Registriert: Sonntag 20. September 2009, 13:39

Hallo und danke für Deine Antwort.

Ich denke da z.B. an Daten, die entweder aus einem dict oder einer Liste kommen oder auch Daten die aus eine sQLite DB kommen.
Ich nutze den Eric4, da ist der QtDesigner mit drin, aber scheinbar nicht das ganze Paket mit Qt oder so.
Denn wenn ich sage import Qt, dann kommt da eine Fehlermeldung.

Was bringt mir das Paket mehr, ist es auch kostenlos, wo bekomme ich es?

Ich hab auch schon ein bischen auf Trolltech herumgeschnuppert. Da blicke ich aber nicht wirklich durch. Ausserdem ist dort alles auf C++ gemünzt.

Viele Grüße
Manfred Dessel
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Also wenn Du PyQt bzw. ein QTreeWidget benutzen möchtest kommst Du nicht umhin es zu importieren.

Die Pakete heißen aber nicht nur Qt sondern PyQt4.paketName

Auch wenn das Buch dem ein oder anderen komplett gegen den Strich geht fand ich es gerade zu Anfagen ganz gut.
Die Rede ist von:

http://openbook.galileocomputing.de/pyt ... efdab7d505

Da steht bisschen was über, wie benutze ich PyQt usw.

Hoffe das trifft dein Problem mit. Was dann mit dem Treewidget geht, also wie es funktioniert
kannst Du getrost bei Trolltech bzw. im Assistent nachlesen, weil daran ändert sich ja nichts.

Abgeshen davon gibts es:
http://www.riverbankcomputing.co.uk/sta ... asses.html


edit:
gerade geshen das nicht alles nach Python übersetzt ist aber manches ...
Gruß
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Das fand ich auch etwas verwirrend:

Das eine mal muss man
from PyQt4 import QtGui, QtCore
importieren,
das nächste mal ist es
from PyQt4.Qt import QSql
Am Ende hat das immer bei mir funktioniert (Auch wenn mich dafür hier jeder hauen wird:


from PyQt4.Qt import *
from PyQt import QtGui, QtCore
lunar

Mein Gott, das ist doch nun wirklich nicht schwer. PyQt4 ist das Gesamtpaket, das wiederum einzelne Module für jedes Qt-Modul (QtCore, QtGui, QtSql, QtNetwork, usw.) enthält. Die Module wiederum gliedern sich nach Funktionalität (QtCore für Basistypen, QtGui für Benutzerschnittstellen, QtSql für Datenbankzugriff, usw.). Steht alles in der Dokumentation …

Code: Alles auswählen

from PyQt4.Qt import * 
from PyQt4 import QtGui, QtCore
ist jedenfalls ziemlicher Unsinn, denn so importierst Du QtGui und QtCore doppelt.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Ersteres ist mir klar.

Aber warum bekomme ich QSql nicht, wenn ich from PyQt4 import *
eingebe, sondern muss das mit from PyQt4.Qt machen?
Was befindet sich jetzt in PyQt4 direkt drinnen, und was erst in PyQt4.Qt?

In der Dokumentation findet man nur, das das Modul jetzt QSql heißt, und nicht QtSql analog zu QtGui...

Das ist fast so verwirrend wie bei xlrd, wo man um einen Exeltimestamp umzuwandeln
xlrd.xldate_as_tuple() verwendet, und für den Schrit zurück xlrd.xldate.xldate_from_datetime_tuple() verwenden muss...


lg,
...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also ich sehe laut Doku, dass das Modul QtSQL heißt...

Zum Paket Qt:
doku hat geschrieben: The Qt module. This module consolidates the classes contained in all of the modules described above into a single module. This has the advantage that you don't have to worry about which underlying module contains a particular class. It has the disadvantage that it loads the whole of the Qt framework, thereby increasing the memory footprint of an application. Whether you use this consolidated module, or the individual component modules is down to personal taste.
Quelle:
http://www.riverbankcomputing.co.uk/sta ... components

Allerdings wäre es auch ziemlich unverständlich, wenn sich Riverbank da nicht an den Modulenamen des Original Qts orientiert hätte...
lunar

@...
Du wirfst da einiges durcheinander. Das Datenbankmodul von Qt heißt sehr wohl QtSql, und das steht so auch in der Dokumentation (cih weiß ja nicht, was Du da gelesen hast). In diesem Modul aber gibt es einen Typen namens "QSql", der aber nur ein paar Konstanten definiert. Der vollständige Name von QSql lautet "PyQt4.QtSql.QSql".

Deswegen „bekommst“ Du "QSql" auch, wenn Du "from PyQt4.Qt import *" nutzt, nicht aber bei "from PyQt4 import *". "PyQt4.Qt" importiert alle Typen aus allen Qt-Modulen, so dass man sich nicht mehr um das richtige Modul kümmern muss. In "PyQt4.Qt" stehen alle Klassen, die in allen Modulen von Qt definiert sind. "from PyQt4.Qt import *" ist also identisch zu

Code: Alles auswählen

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSql import *
from PyQt4.QtNetwork import *
…
"PyQt4.Qt.QMainWindow" und "PyQt4.QtGui.QMainWindow" beziehen sich somit auf dieselbe Klasse.

In "PyQt4" dagegen befinden sich alle Module, z.B "QtGui", "QtCore", "QtSql" und eben auch das „Supermodul“ "Qt". "from PyQt4 import *" funktioniert allerdings trotzdem nicht, da Module eines Pakets nicht zum Namensraum eines Pakets gehören.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Ah... vielen Dank!
Das hat mir jetzt endlich mal einen Durchblick durch die Struktur verschafft...
Und jetzt ist mir klar, warum es doch oft mit meinen einzelnen Imports nicht funktioniert hatte, sondern erst, wenn ich dann doch den Overkill einsetzte :-)

lg,
...
MDGo88
User
Beiträge: 18
Registriert: Sonntag 20. September 2009, 13:39

Sorry,
das ich mich jetzt erst melde, ich war unterwegs. Vielen Dank für die Antworten.
Doch habe ich immer noch ein Problem. Ich habe auf der folgenden Seite das nachfolgende Beispiel gefunden:

http://www.commandprompt.com/community/pyqt/x3270

Code: Alles auswählen

#
# tree.py - a simple tree with QListView
#
import sys
from qt import *


class MainWindow(QMainWindow):

    def __init__(self, *args):
        apply(QMainWindow.__init__, (self,) + args)
        self.tree = QListView(self)
        self.setCentralWidget(self.tree)
        self.tree.addColumn("item")
        self.tree.setRootIsDecorated(1)
        self.items=[]
        self.items.append(QListViewItem(self.tree, "testself1"))
        self.items.append(QListViewItem(self.items[-1], "child 1"))
        self.items.append(QListViewItem(self.items[-2], "child 2"))

def main(args):
    app=QApplication(args)
    win=MainWindow()
    win.show()
    app.connect(app, SIGNAL("lastWindowClosed()"),
                app, SLOT("quit()"))
    app.exec_loop()

if __name__=="__main__":
    main(sys.argv)
irgendwie erhalte ich aber immer eine Fehlermeldung. Was ist denn hier falsch

Viele Grüsse
mdgo88
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

lunar hat geschrieben:"from PyQt4 import *" funktioniert allerdings trotzdem nicht, da Module eines Pakets nicht zum Namensraum eines Pakets gehören.
Hallo lunar! Wenn ich dich richtig verstehe arbeitet import, entgegen der Annahme vieler Benutzer, also nicht rekursiv.
Sobald sich ein sogenanntes "Superpaket" in den mit * selektierten Paketen befindet, werden dessen "Unterpakete" nicht mit-importiert, oder?
lunar

So in etwa … ein "from paket import *" importiert nur die Namen, die in der "__init__.py" des Pakets vorhanden sind, nicht aber alle "*.py"s im Paketverzeichnis.
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Hmm was ich nicht versteh ist du möchtest doch einen TreeView machen oder ?
def __init__(self, *args):
apply(QMainWindow.__init__, (self,) + args)
self.tree = QListView(self)
hier machst Du aber was anderes.

irgendwie erhalte ich aber immer eine Fehlermeldung. Was ist denn hier falsch

Viele Grüsse
mdgo88
Fehlermeldungen können langes Suchen ersparen ( wenn man sie kennt ..... ).
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Deine Anleitung ist echt alt. Also wirklich alt ...

Vergiss sie ....
A note on versions: when I wrote this book I mostly used the stable 2.x versions of Qt, but as soon as betas of Qt 3.x became available, I started integrating information about its improvements in the text. I will note wherever one version is different from the other. On the Opendocs webforum for this book you'll find versions of the examples both for Qt 2.x and Qt 3.x.
Antworten