Seite 1 von 1
Fragen zu subWindowList
Verfasst: Freitag 24. Mai 2019, 15:27
von Nobuddy
Hallo zusammen,
in der subWindowList werden ja alle aktven Fenster aufgeführt.
Welche Informatinonen bzw. Daten sind in einem aktiven Fenster abgespeichert.
Sind da evtl. auch die Daten einer Tabelle enthalten?
Vielleicht kann mir Jemand von Euch "kurz ...." erklären, wie ich mir das vorstellen kann?
Grüße Nobuddy
Re: Fragen zu subWindowList
Verfasst: Freitag 24. Mai 2019, 17:01
von __deets__
Klingt nach einer schlechten Idee. Wenn du dich durch die gui hakeln musst, um Anwendungsdaten zu finden, machst du was falsch.
Was ist dein use case?
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 09:57
von Nobuddy
Hallo __deets__,
dachte mir, dass so eine Antwort kommt, Du hast ja damit auch Recht.
Mich interessiert, wie der Aufbau eines SubWindows ist und welche Möglichkeit besteht, auf Daten und Einstellungen innerhalb des SubWindows Einfluss zu nehmen.
Der Hintergrund ist folgender.
Ich arbeite mit Tabellen.
Bei Änderung einer Tabelle, sind auch bestimmte andere Tabellen davon betroffen.
Ich habe z.B. mehere SubWindows geöffnet.
Ich nehme eine Änderung in einer Tabelle vor, die auch eine Änderung einer weiteren Tabelle erfordert.
Beide Tabellen sind jeweils in einem SubWindow hinterlegt.
Welche Möglichleit habe ich, auch die zweite Tabelle mit der Änderung zu aktualisieren?
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 10:13
von __deets__
Das ist der klassische anwendungsfall für das MVC pattern - Model view Controller.
Und Qt unterstützt das mit seinen diversen Q*ItemModeln. Dadurch kann deine Manipulation eines Datensatzes im Modell sich auch in andere views propagieren.
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 10:15
von Nobuddy
Das hört sich ja gut an!
Kannst Du mir evtl. dazu ein kleines Beispiel liefern, damit ich mir das richtig vorstellen kann?
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 10:49
von __deets__
Nein. Bin im Urlaub. Habe ich glaube aber mal mit Attalantore diskutiert & was gebastelt.
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 12:57
von Nobuddy
Habe gerade festgestellt, dass ich das MVC pattern schon 'eingeschränkt' nutze.
Wenn ich das richtig verstanden habe, kann ich mittels eines Dictionarys, Zugriff auf die anderen Tabellen erhalten.
Code: Alles auswählen
try:
self.window2model
except AttributeError:
self.window2model = dict()
self.window2model[self.mdi_area.activeSubWindow] = self.model
Das dürfte dann mit diesem Schema funktionieren.
Danke Dir für Deine Hilfe!
Grüße und noch einen schönen Urlaub!
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 13:23
von __deets__
Das ist eigentlich nicht wirklich wie man das macht. Das Modell bindet man an einen view (table, tree, list) und dann werden Änderungen durch die Model Signale automatisch propagiert.
Re: Fragen zu subWindowList
Verfasst: Samstag 25. Mai 2019, 13:52
von Nobuddy
Kleines Beispielin gekürzter Form:
Code: Alles auswählen
class Table(QWidget):
def __init__(self, parent, title, dataList, header, columnWidths):
QWidget.__init__(self)
self.parent = parent
self.title = title
self.old_data = self.mylist = self.dataList = sorted(dataList)
self.header = header
self.columnWidths = columnWidths
self.mdi_area = parent.mdi_area
self.setWindowTitle(self.title)
self.old_data_counter = len(self.dataList)
if self.old_data_counter == 0:
print('Keine Daten vorhanden!')
return
self.installEventFilter(self)
self.view = QTableView()
self.model = TableModel(self, self.dataList, self.header)
self.parent.mdi_area.window2model[
self.parent.mdi_area.activeSubWindow()] = self.model
QtTools().headerSize(self)
self.update_table()
# GridLayout
grid = QGridLayout()
grid.addWidget(self.view, 0, 0)
self.setLayout(grid)
# Center the window in the display
QtTools().center(self)
def updateGeometryAsync(self):
QtCore.QTimer.singleShot(0, self.updateGeometry)
def update_table(self):
# ... when a row header label changes and makes the
# width of the vertical header change too
self.model.headerDataChanged.connect(self.updateGeometryAsync)
self.view.setModel(self.model)
# enable sorting
self.view.setSortingEnabled(True)
self.view.setSelectionBehavior(QAbstractItemView.SelectRows)
self.old_data_counter = len(self.mylist)
self.mdi_area.adjustSize()
# set focus of first line in table
index = self.view.model().index(0, 1)
self.view.setCurrentIndex(index)
class Dataset(QWidget):
def __init__(self, parent, dataset, header, columnWidths):
super(Dataset, self).__init__()
self.parent = parent
self.mdi_area = self.parent.mdi_area
self.old_dataset = self.dataset = dataset
try:
self.old_list = self.parent.mylist
except AttributeError:
pass
self.header = header
self.columnWidths = columnWidths
try:
self.width = max(columnWidths)
except TypeError:
self.width = columnWidths
self.setObjectName('DATASET')
self.installEventFilter(self)
self.setFocusPolicy(Qt.StrongFocus)
self.view = QTableView(self)
self.view.clicked.connect(self._item_clicked)
# GridLayout
grid = QGridLayout()
grid.addWidget(self.view, 0, 0)
self.setLayout(grid)
self.model = QStandardItemModel(self)
# Load dataset
[self.model.invisibleRootItem().appendRow(
QStandardItem(column)) for column in self.dataset]
# Vertical header
[self.model.setHeaderData(i, Qt.Vertical, column)
for i, column in enumerate(header)]
QtTools().headerSize(self)
self.proxy = QSortFilterProxyModel(self)
self.proxy.setSourceModel(self.model)
self.view.setModel(self.proxy)
QtTools().center(self)
# clear rows in dataset
self.shortcut = QShortcut(QKeySequence("Alt+C"), self)
self.shortcut.activated.connect(self.clear)
............
.........
....
def save_close(self):
print('SAVE + CLOSE')
i2format = self.dataset_format()
for i in range(len(self.header)):
text = self.model.invisibleRootItem().child(i).text()
text = CreateFormat(i2format[i], text).value
self.parent.model.mylist[self.parent.index][i] = text
self.parent.model.mylist = sorted(self.parent.model.mylist)
self.parent.model.layoutChanged.emit()
So setze ich die Änderung eines Datensatzes in der Liste um.
Wenn jetzt Teile der Änderung, auch in einer anderen Liste aktualisiert werden müssen, muss ich doch das model zu der gehörenden Liste kennen, oder?
Grüße Nobuddy