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()