QTableView Update
Verfasst: Donnerstag 31. August 2023, 12:02
Hallo Zusammen,
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?
Danke und Gruß
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()