Fragen zu subWindowList

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Freitag 24. Mai 2019, 15:27

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
__deets__
User
Beiträge: 5782
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 24. Mai 2019, 17:01

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?
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Samstag 25. Mai 2019, 09:57

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?
__deets__
User
Beiträge: 5782
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 25. Mai 2019, 10:13

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.
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Samstag 25. Mai 2019, 10:15

Das hört sich ja gut an!
Kannst Du mir evtl. dazu ein kleines Beispiel liefern, damit ich mir das richtig vorstellen kann?
__deets__
User
Beiträge: 5782
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 25. Mai 2019, 10:49

Nein. Bin im Urlaub. Habe ich glaube aber mal mit Attalantore diskutiert & was gebastelt.
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Samstag 25. Mai 2019, 12:57

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! :wink:
__deets__
User
Beiträge: 5782
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 25. Mai 2019, 13:23

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.
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Samstag 25. Mai 2019, 13:52

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
Antworten