pyQt und Qtable anzeige der aktuellen Tabellenzeile

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

http://www.riverbankcomputing.co.uk/sta ... ml#details
Solltest du mittlerweile gelesen haben (hoffe ich). Dann weißt du dass du natürlich noch deine Tabelle setzen musst die du anzeigen willst.

Code: Alles auswählen

model.setTable("personen") # oder wie deine Tabelle heißt
Denn jede DB kann mehrere Tabellen haben, und das TableModel ist halt zur Anzeige von einer Tabelle (mehr macht irgendwie in einem TableView wenig Sinn) ausgelegt.

Wenn du die Tabellen verbindest (foreign keys), ist das hier natürlich nix mehr, dann brauchst du QSqlRelationalTableModel.
MDGo88
User
Beiträge: 18
Registriert: Sonntag 20. September 2009, 13:39

Hallo Franz,

hab's schon eigebaut. So, die Überschriften werden angezeigt, aber leider keine Daten.
Hast Du eine Idee?

Gruß
MDGo88
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

MDGo88 hat geschrieben:hab's schon eigebaut. So, die Überschriften werden angezeigt, aber leider keine Daten.
Hast Du eine Idee?

Code: Alles auswählen

model.select()
Steht aber so auch in dem Beispiel aus dem link oben ;)

// edit: Dein Beispiel ist immer noch zu komplex. Du brauchst das ganze .ui-Gedöhns samt Klasse gar nicht. Für so kleine Tests nehm ich immer die Python-Konsole her und experimentier einfach bissl rum. So schaut es jetzt bei mir aus:

Code: Alles auswählen

>>> from PyQt4.Qt import *
>>> app = QApplication([])
>>> db = QSqlDatabase.addDatabase("QSQLITE")
>>> db.setDatabaseName("/pfad/zur/test1.db")
>>> model = QSqlTableModel()
>>> model.setTable("person")
>>> view = QTableView()
>>> view.setModel(model)
>>> model.select()
True
>>> view.show()
Sind genau 10 Zeilen Code incl. dem Import.
Zuletzt geändert von franzf am Montag 5. Oktober 2009, 19:24, insgesamt 1-mal geändert.
MDGo88
User
Beiträge: 18
Registriert: Sonntag 20. September 2009, 13:39

Hallo Franz,

endschuldige, ich hab den Link zu spät gesehen. Jatzt hats funktioniert.
Ist ja echt nicht all zuviel Code.

Vielen, vielen Dank für Deine Hilfe.

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

Hallo Franz,

wenn es geht, würde ich Dich doch nochmal bemühen. Ich bin im Prinzip
wieder an der gleichen Stelle, wie am Anfang meines Problems.
Ich würde gerne die Daten einer Tabellenzeile in die einzelnen
LineEditFelder schreiben. Dazu hast Du mir schon mal das Coding für das Mapping gesendet.

Dieses habe ich über ein Sgnla versucht aufzurufen (Ohne Erfolg)

Viele Grüße
MDGo88

Code: Alles auswählen

        ## Events Main ##
        self.connect(self.customerGUI.pushButton, QtCore.SIGNAL("clicked()"), self._beforeExit)
        self.connect(self.customerGUI.tab_1, QtCore.SIGNAL("doubleClicked(QModelIndex)"), self.printItemText) 
        ## Events Main ##

        
    def printItemText(self, item):
        mapper = QtGui.QDataWidgetMapper()
        mapper.setModel(self.model)
        mapper.addMapping(self.customerGUI.le_Vorname, 1)
        mapper.addMapping(self.customerGUI.le_Nachname, 2)        
        
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Code: Alles auswählen

from PyQt4.Qt import *
import sys

class DBWidget (QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.view = QTableView(self)

        self.idSpin = QSpinBox(self)
        self.idSpin.setRange(0, 100000)
        self.firstNameEdit = QLineEdit(self)
        self.secondNameEdit = QLineEdit(self)
        self.submitButton = QPushButton("submit", self)

        layout = QHBoxLayout(self)
        layout.addWidget(self.view)
        editLayout = QVBoxLayout()
        layout.addLayout(editLayout)
        editLayout.addWidget(self.idSpin)
        editLayout.addWidget(self.firstNameEdit)
        editLayout.addWidget(self.secondNameEdit)
        editLayout.addSpacing(10)
        editLayout.addWidget(self.submitButton)
        editLayout.addStretch()

        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("/home/franz/test/test1.db")
        self.model = QSqlTableModel()
        self.model.setTable("person")
        self.model.select()

        self.view.setModel(self.model)

        self.mapper = QDataWidgetMapper(self)
        self.mapper.setModel(self.model)
        self.mapper.addMapping(self.idSpin, 0)
        self.mapper.addMapping(self.firstNameEdit, 1)
        self.mapper.addMapping(self.secondNameEdit, 2)
        self.mapper.toFirst()

        self.connect(self.view, SIGNAL('clicked(const QModelIndex&)'), self.mapper.setCurrentModelIndex)
        self.connect(self.submitButton, SIGNAL('clicked()'), self.model.submitAll)


app = QApplication(sys.argv)
w = DBWidget()
w.show()
app.exec_()
Das Prinzip sollte ja jetzt klar sein.
MDGo88
User
Beiträge: 18
Registriert: Sonntag 20. September 2009, 13:39

Hallo Franz,

genauso hatte ich mir das vorgestellt, Danke.

Habe ich Recht mit der Annahme, das du für die GUIs den Designer
überhaupt nicht nutzt?

Wenn ja, was machst Du denn bei komplizierteren GUIs und deren
Änderbarkeit. Ist das nicht sehr aufwendig?

Gruß
MDGo88
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

MDGo88 hat geschrieben:Habe ich Recht mit der Annahme, das du für die GUIs den Designer
überhaupt nicht nutzt?

Wenn ja, was machst Du denn bei komplizierteren GUIs und deren
Änderbarkeit. Ist das nicht sehr aufwendig?
Da hast du nicht Recht. Nur bringt ein Beispiel recht wenig, wenn man auch noch externe Dateien mitliefern muss. Es ist gleich ausführbar und besser lesbar.

Ansonsten setze ich stark auf den Designer, da er Änderungen leichter möglich macht, auch bei kleinen Formularen :)
Antworten