PyQt6 QSqlRelationalTableModell

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
schloss5020
User
Beiträge: 4
Registriert: Dienstag 30. November 2021, 09:54

Hallo!
Ich habe eine SQLITE Datenbank. In der Datenbank habe ich die Tabellen Teilestamm, Teileart und Materialart. Den Teilestamm warte ich mit QsqlRealitional-Modell und Qtableview. Die Felder Teileart und Materialart werden als Combobox angezeigt. Aus dem Hauptprogramm kann ich die Teileart und Materialart warten. Nun habe ich folgendes Problem, wenn ich eine neue Teileart hinzufüge, wird sie zwar in die Datenbank eingefügt, aber in der Combox im Teilestamm kann ich die neue Teileart nicht sehen. Wie kann ich die Combobox auffrischen?

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QHBoxLayout,QMessageBox,QPushButton,QSizePolicy,\
QSpacerItem, QTableView, QStatusBar, QVBoxLayout, QWidget, QLabel
from PyQt6.QtCore import QIdentityProxyModel, Qt
from PyQt6.QtSql import QSqlDatabase, QSqlRelationalTableModel, QSqlRelationalDelegate, QSqlTableModel,\
QSqlRelation

from teileart import TeileartFenster
import materialart



class Fenster(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("Teilestamm")
self.setGeometry(300, 100, 700, 600)
self.ui()
self.datenbank()
self.model()
self.tabelle()
self.slots()

def ui(self):
self.setWindowTitle("Teilestamm")
widget = QWidget()
bhl = QHBoxLayout()
bvl = QVBoxLayout()
self.add=QPushButton("Neue Zeile")
self.loesch=QPushButton("Zeile löschen")
self.teilearten = QPushButton("Teileart editieren")
self.materialarten=QPushButton("Materialart editieren")
self.beenden= QPushButton("Beenden")
self.tableView=QTableView()
verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
bhl.addWidget(self.tableView)
bvl.addWidget(self.add)
bvl.addWidget(self.loesch)
bvl.addWidget(self.teilearten)
bvl.addWidget(self.materialarten)
bvl.addWidget(self.beenden)
bvl.addItem(verticalSpacer)
bhl.addLayout(bvl)
widget.setLayout(bhl)
self.setCentralWidget(widget)
filemenu = self.menuBar().addMenu("&File")
hahamenu = self.menuBar().addMenu("&Haha")
close_action = filemenu.addAction("&Beenden")
close_action.triggered.connect(self.close)
self.statusBar = QStatusBar()
self.setStatusBar(self.statusBar)

def datenbank(self):
self.db = QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName('Stuecklisten.db')
if not self.db.open():
error = self.db.lastError().text()
QMessageBox.critical(None, 'Datenbakverbindungsfehler',
'Kann die Datenbank nicht öffnen: '
f'{error}')
sys.exit(1)
required_tables = {'Teileart'}
missing_tables = required_tables - set(self.db.tables())
if missing_tables:
QMessageBox.critical(
None, 'DB Fehler',
'Tabellen fehlen, bitte reparieren Sie die DB: '
f'{missing_tables}')
sys.exit(1)

def model(self):
self.model = QSqlRelationalTableModel()
self.model.setTable('Teilestamm')
#self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
self.model.setRelation(2, QSqlRelation('Teileart', 'Id', 'Teileartbezeichnung'))
self.model.setRelation(3, QSqlRelation('Materialart', 'Id', 'Materialbezeichnung'))
self.model.select()

def tabelle(self):
self.tableView.setModel(self.model)
self.tableView.setItemDelegate(QSqlRelationalDelegate())
#stylesheet = "QHeaderView::section {Background-color:rgb(235,255,209); font: 15px}"
#self.tableView.setStyleSheet(stylesheet)
self.tableView.setSortingEnabled(True)
self.tableView.resizeColumnsToContents()
self.tableView.verticalHeader().hide()
self.tableView.setWindowTitle("Weiß noch nicht was")
self.tableView.sortByColumn(0,Qt.SortOrder.AscendingOrder)
self.lbl = QLabel()
self.statusBar.addWidget(self.lbl)
self.lbl.setText("Anzahl Sätze: " + str(self.model.rowCount()))



def slots(self):
self.add.clicked.connect(self.neuezeile)
self.loesch.clicked.connect(self.loeschen)
self.teilearten.clicked.connect(self.teileartdialog)
self.materialarten.clicked.connect(self.materialartdialog)
self.beenden.clicked.connect(self.close)

def neuezeile(self):
self.model.insertRow(self.tableView.currentIndex().row())
#self.model.select()
self.lbl.setText("Anzahl Sätze: " + str(self.model.rowCount()))

def loeschen(self):
teilebezeichnung = self.model.record(self.tableView.currentIndex().row()).value(1)
msg = QMessageBox.warning(self, "Sicherheitsabfrage",
"Soll der Teilestamm " + teilebezeichnung + " wirklich geloescht werden?", QMessageBox.StandardButton.Yes |
QMessageBox.StandardButton.No)
if msg == QMessageBox.StandardButton.Yes:
self.model.removeRow(self.tableView.currentIndex().row())
self.model.select()
self.lbl.setText("Anzahl Sätze: " + str(self.model.rowCount()))

def teileartdialog(self):
teileard = TeileartFenster()
teileard.exec()
self.model.select()

def materialartdialog(self):
materialartd=materialart.Fenster()
materialartd.exec()
self.model.select()



if __name__ == '__main__':
app = QApplication(sys.argv)
stylesheet = open("dark_orange.qss").read()
app.setStyleSheet(stylesheet)
fenster=Fenster()
fenster.showMaximized()
app.exec()
schloss5020
User
Beiträge: 4
Registriert: Dienstag 30. November 2021, 09:54

Ich habe die Lösung selber gefunden. Ich lösche das Modell und rufe es erneut auf.

Code: Alles auswählen

def teileartdialog(self):
        teileard = TeileartFenster()
        teileard.exec()
        self.model.clear()
        self.modell()
Antworten