FocusIn, Item-Position in Dataset-Tabelle ermitteln

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
__blackjack__
User
Beiträge: 13133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nobuddy: Ich würde das ja in die Fenster integrieren und ja, richtige Fenster. Für MDI muss man IMHO in Zeiten wo mehr als ein Monitor nichts exotisches mehr ist, schon eine gute Begründung haben. MDI empfinde ich immer als nervig und einschränkend. Und dass das letztlich immer das Gleiche bleibt: Warum ist das ein Argument es nicht in die Fenster zu integrieren? Auch dann muss man den immer gleichen Code ja nur *einmal* schreiben. Man hat ja nicht den Code für jedes Fenster einzeln und kopiert‽
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

An mehrere Monitore, habe ich jetzt nicht gedacht, da wäre dann auf jeden Fall das Integrieren der Buttons in die einzelnen Fenster wichtig. Diese Szenario brauche ich jetzt für mich nicht. Eine anschließende Änderung für mehrere Monitore, wäre dann schon eine Herausforderung.

Ich habe mich MDI angefreundet, obwohl es da nicht gerade übermäßig viele Resultate beim Googeln gibt.
Mir fehlt einfach das Gesamtwissen über Py und PyQt, um andere Lösungen schnell und einfach umsetzen zu können, was Ihr mit "links" macht. Für mich ist es wichtig, meinen Code zu verstehen.
Ich lerne gerne dazu. Was ich auch verstanden habe und Ihr mir versucht habt nahezulegen, den Code so einfach wie möglich zu halten, bzw. den Code in einzelne Funktionen aufzuteilen. Da bin ich heute schon ein kleinen Schritt dem näher gekommen.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Ich habe hier mal den Test-Code für das Dataset-Window, der lauffähig ist für Euch zum Testen, damit Ihr die Funktionsweise nachvollziehen könnt.

Code: Alles auswählen

import os
import sys
import operator  # used for sorting
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import (Qt, QSize, QEvent, QObject, 
    QSortFilterProxyModel)
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import (QMainWindow, QMdiArea, QWidget, QMessageBox, 
    QToolBar, QTableView, QGridLayout, QHBoxLayout, QAction, QApplication,
    qApp)

title = 'Backlight management'
header = ['Pos', 'Supplier', 'Artikel', 'Benennung']
mylist = [['001', 'Meyer', '47110', 'Bratwurst weiss, 125 g'],
['002', 'Meyer', '47111', 'Bratwurst weiss, 425 g'],
['003', 'Meyer', '47112', 'Bratwurst weiss, 1225 g']]
columnWidths = [20, 15, 20, 40]


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("MDI demo")
        self.mdi_area = QMdiArea()
        self.setCentralWidget(self.mdi_area)
        ## Toolbar
        screen_position = 'below'
        buttons = [
            ['close', 'Ctrl+Q', self.close],
            ]
        ToolBar(self, screen_position, buttons)
        self.mylist = mylist
        self.index = 0
        sub = Dataset(self, mylist[self.index], header, columnWidths)
        sub.setWindowTitle(title)
        self.mdi_area.addSubWindow(sub)
        sub.show()

    def close(self):
        print('CLOSE')
        if self.mdi_area.activeSubWindow():
            self.mdi_area.activeSubWindow().widget().exec_()
            self.mdi_area.removeSubWindow(self.mdi_area.activeSubWindow())
            return
        qApp.quit()

class Dataset(QWidget):

    def __init__(self, parent, dataset, header, columnWidths):
        super(Dataset, self).__init__()
        self.parent = parent
        self.old_dataset = self.dataset = dataset
        self.old_list = self.parent.mylist
        self.header = header
        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()
        # 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)]
        self.proxy = QSortFilterProxyModel(self)
        self.proxy.setSourceModel(self.model)
        self.view.setModel(self.proxy)

    def _item_clicked(self, index):
        # numeric position of dataset
        pos2dataset = index.row()
        # in front of item
        self.item_after = index.sibling(1,0)
        # in front of item
        item_before = index.sibling(-1,0)

    def closeEvent(self, event):
        self.exec_()
        event.accept()

    def exec_(self):
        try:
            self.view.setCurrentIndex(self.item_after)
        except AttributeError:
            pass
        self.dataset = [self.model.invisibleRootItem().child(i).text()
            for i in range(len(self.header))]
        if self.dataset != self.old_dataset:
            r = MessageBox(QMessageBox.Yes, 'Änderung speichern?')
            if r.result() != QMessageBox.Yes:
                self.dataset = self.old_dataset
        print('self.dataset', self.dataset)
        return self.parent.mylist


class ToolBar(QToolBar): 

    def __init__(self, parent, position, buttons):
        QToolBar.__init__(self)
        # Change Font
        font = self.font()
        font.setFamily("Arial") 
        font.setPointSize(18)

        self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        #self.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
        positions = {
            'up' : QtCore.Qt.TopToolBarArea,
            'left' : QtCore.Qt.LeftToolBarArea,
            'right' : QtCore.Qt.RightToolBarArea,
            'below' : QtCore.Qt.BottomToolBarArea,
            }

        for button, shortcut, comand in buttons:
            path = ''
            action = QAction(QIcon(path), button.capitalize(), self)
            try:
                action.triggered.connect(comand)
            except TypeError:
                pass
            action.setShortcut(shortcut)
            action.setFont(font)
            if path == '':
                action.setCheckable(True)
            widget = QWidget()
            widget.setLayout(QHBoxLayout())
            self.addWidget(widget)
            self.addAction(action)
            if position == 'right':
                self.addSeparator()
        parent.addToolBar(positions[position.lower()], self)

        self.setAllowedAreas(
            QtCore.Qt.TopToolBarArea
            | QtCore.Qt.BottomToolBarArea
            | QtCore.Qt.LeftToolBarArea
            | QtCore.Qt.RightToolBarArea
            )  
        self.setStyleSheet(
            "color: blue;"
            "background-color: yellow;"
            "selection-color: red;"
            "selection-background-color: blue;"
            ) 

 
class MessageBox(QMessageBox): 

    def __init__(self, buttonReply, text):
        QMessageBox.__init__(self)
        self.setText(text)
        if buttonReply == self.Ok:
            self.setIcon(self.Warning)
            self.setWindowTitle('Info')
            self.setStandardButtons(self.Ok)
            self.setEscapeButton(self.Cancel)
            default = self.Cancel
        elif buttonReply == self.Yes:
            self.setIcon(self.Warning)
            self.setWindowTitle('Question')
            self.setStandardButtons(self.Yes | self.No)
            default = self.No
        elif buttonReply == self.Cancel:
            self.setIcon(self.Question)
            self.setWindowTitle('Question')
            self.setStandardButtons(self.Yes | self.No | self.Cancel)
            self.setEscapeButton(self.Cancel)
            default = self.Cancel
        elif buttonReply == self.Save:
            self.setIcon(self.Question)
            self.setWindowTitle('Save and Exit')
            self.setStandardButtons(self.Save | self.Discard | self.Cancel)
            self.setInformativeText('Änderung speichern?')
            self.setEscapeButton(self.Cancel)
            default = self.Cancel
        self.setDefaultButton(default)
        self.exec_()

def main():
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Antworten