Ich mache ein Update im model, aber die TableView bekommt das nicht mit (Zeile 116). Auch die Spaltenbreiten werden nicht gesetzt (Zeile 96). Weiß jemand Rat?
Code: Alles auswählen
#!/usr/bin/env python3
from sqlalchemy import INTEGER, TEXT, Column, create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
import sys
from PyQt6.QtCore import QAbstractTableModel, QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QToolBar, QStatusBar
from PyQt6.QtGui import QAction, QIcon
Base = declarative_base()
Session = sessionmaker()
class Project(Base):
__tablename__ = "project"
project_id = Column(INTEGER, primary_key=True)
project_name = Column(TEXT, nullable=False, unique=True)
project_netplan = Column(TEXT, nullable=True)
project_description = Column(TEXT, nullable=True)
class TableModel(QAbstractTableModel):
def __init__(self, session):
super().__init__()
self.session = session
self.column_labels = ['Projekt', 'Netzplan', 'Beschreibung']
self.column_attributes = ['project_name', 'project_netplan', 'project_description']
self.projects = self.session.query(Project).all()
def headerData(self, section, orientation, role):
if role == Qt.ItemDataRole.DisplayRole:
if orientation == Qt.Orientation.Horizontal:
return self.column_labels[section]
elif orientation == Qt.Orientation.Vertical:
return f'Zeile-{section} '
else:
return False
def data(self, index, role):
if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
return getattr(self.projects[index.row()], self.column_attributes[index.column()])
def setData(self, index, value, role):
if role == Qt.ItemDataRole.EditRole:
setattr(self.projects[index.row()], self.column_attributes[index.column()], value)
self.session.commit()
# Test
# for pq in self.session.query(Project).all():
# print(f'{pq.project_name} {pq.project_netplan} {pq.project_description} ID = {pq.project_id}')
return True
return False
def flags(self, index):
return Qt.ItemFlag.NoItemFlags | Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable
def rowCount(self, _index):
return len(self.projects)
def columnCount(self, _index):
return len(self.column_labels)
def update(self):
self.projects = self.session.query(Project).all()
class MainWindow(QMainWindow):
def __init__(self, session):
super().__init__(windowTitle = "Projekt-Daten")
self.resize(QSize(1000, 500))
self.session = session
self.toolbar = QToolBar("Toolbar Test")
self.toolbar.setIconSize(QSize(16,16))
self.addToolBar(self.toolbar)
self.button_new = QAction(QIcon("icons/new.png"), "Neu", self)
self.button_new.setStatusTip("Neues Projekt hinzufügen")
self.button_new.triggered.connect(self.buttonNewClick)
self.toolbar.addAction(self.button_new)
self.button_delete = QAction(QIcon("icons/cross.png"), "Löschen", self)
self.button_delete.setStatusTip("Markiertes Projekt Löschen")
self.button_delete.triggered.connect(self.buttonDeleteClick)
self.toolbar.addAction(self.button_delete)
self.button_exit = QAction(QIcon("icons/arrow-skip.png"), "Exit", self)
self.button_exit.setStatusTip("Projekt-Daten verlassen")
self.button_exit.triggered.connect(self.buttonExitClick)
self.toolbar.addAction(self.button_exit)
self.setStatusBar(QStatusBar(self))
self.table = QTableView()
self.table.resizeColumnsToContents() # <------------------ Keine Änderung
self.model = TableModel(self.session)
self.table.setModel(self.model)
self.layout = QVBoxLayout()
self.layout.addWidget(self.table)
self.widget = QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
def buttonNewClick(self, s):
self.project = Project(
project_name = f'---',
project_netplan = f'----',
project_description = f'-----'
)
self.session.add(self.project)
self.session.commit()
self.model.update() # <------------------------------- Kein Update
# Testdaten ausgeben
for pq in self.session.query(Project).all():
print(f'{pq.project_name} {pq.project_netplan} {pq.project_description} ID = {pq.project_id}')
def buttonDeleteClick(self, s):
print("-")
def buttonExitClick(self, s):
print("--")
def main():
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
session = Session(bind=engine)
# Testdaten erzeugen
for i in range(12):
project = Project(
project_name = f'P-{i}-{i*10}',
project_netplan = f'Netplan-{i / 5}',
project_description = f'Description-{i * 22}'
)
session.add(project)
# Eintragen in Datenbank
session.commit()
# Auslesen aller Datensätze aus Datenbank
for pq in session.query(Project).all():
print(f'{pq.project_name} {pq.project_netplan} {pq.project_description} ID = {pq.project_id}')
app = QApplication(sys.argv)
window = MainWindow(session)
window.show()
app.exec()
if __name__ == "__main__":
main()