mein Problem: Selektierte Zeile in einer TableView / TableViewModel farbig markieren und demarkieren
Aktuell wird das gesamte Model / View beim Klick in die View rot eingefärbt
Folgendes verwende ich
Pyqt5
TableViewModel = QAbstractTableModel
TableView = QtWidgets.QTableView
Code: Alles auswählen
class TableViewModel(QtCore.QAbstractTableModel):
def __init__(self, records, parent=None):
super().__init__(parent)
self.datatable = records
self.color_enabled = False
self.color_back = QtCore.Qt.magenta
def rowCount(self, parent=QtCore.QModelIndex):
return len(self.datatable)
def columnCount(self, parent=QtCore.QModelIndex):
return len(self.datatable[0]) if self.datatable else 0
def data(self, index, role, **kwargs): #role=QtCore.Qt.DisplayRole?
#reason = kwargs.get('r', None)
if index.isValid() and role == QtCore.Qt.DisplayRole:
return str(self.datatable[index.row()][index.column()])
if index.isValid() and role == QtCore.Qt.BackgroundRole and self.color_enabled:
return gui.QBrush(gui.QColor(255, 0, 43)) #red
def row_clicked(self, index, role = QtCore.Qt.BackgroundRole):
# numeric position of dataset
if index is not None:
row = index.row()
column = index.column()
if column == 0:
self.itemnumber = index.sibling(row, column)
self.itemname = index.sibling(row, column + 1)
self.itemsize = index.sibling(row, column + 2)
elif column == 1:
self.itemnumber = index.sibling(row, column - 1)
self.itemname = index.sibling(row, column)
self.itemsize = index.sibling(row, column + 1)
elif column == 2:
self.itemnumber = index.sibling(row, column - 2)
self.itemname = index.sibling(row, column - 1)
self.itemsize = index.sibling(row, column)
return (self.itemnumber, self.itemname, self.itemsize, index) #return objects!!! no real datas
#print("Ausgewählter Artikel: ",self.itemindex.data(), self.itemname.data(), self.itemsize.data())
def flags(self, index):
return QtCore.Qt.ItemIsEnabled
def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole and orientation == QtCore.Qt.Horizontal:
return header_table_view[section]
return QtCore.QAbstractTableModel.headerData(self, section, orientation, role)
def change_color(self, color, color_enabled): #emit läuft auf einen Fehler: PyQt5.QtCore.pyqtSignal' object has no attribute 'emit' - Aufruf in der View
self.layoutAboutToBeChanged.emit()
self.color_enabled = color_enabled
self.color_back = color
self.layoutChanged.emit()
class TableView(QtWidgets.QTableView):
#class members
clickedRows = []
clickedData = []
#functions
def __init__(self, model, parent=None):
super().__init__(parent)
self.index = 0
self.setModel(model)
self.clicked.connect(self.viewClicked)
self.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
self.setSelectionMode(QtWidgets.QTableView.MultiSelection)
self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.horizontalHeader().setDefaultAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
self.setColumnWidth(0,15)
self.setColumnWidth(1,200)
self.setColumnWidth(2,40)
self.setColumnWidth(3,300)
self.resizeColumnsToContents()
#self.activated.connect(self.clicked_enter)
#self.delegate = ViewDelegate() #delegate inaktiv, da nichts in der View direkt gemacht wird, Daten werden pro Zeile ausgelesen und in einem extra Dialog bearbeitet
#self.setItemDelegate(self.delegate)
self.setVerticalScrollMode(QtWidgets.QTableView.ScrollPerPixel)
def viewClicked(self, clickedIndex):
if clickedIndex.row() not in self.clickedRows:
TableView.clickedRows.append(clickedIndex.row())
record = TableViewModel.row_clicked(TableViewModel, clickedIndex)
TableView.clickedData.append(record)
#TableViewModel.change_color(TableViewModel, QtCore.Qt.magenta, False)
#TableViewModel.data(TableViewModel, index=clickedIndex, role=QtCore.Qt.BackgroundRole, r='isSelected')
#TableViewModel.itemData(row, col).setData(role=QtCore.Qt.BackgroundRole, color=gui.QColor(227, 57, 221))
elif clickedIndex.row() in self.clickedRows:
TableView.clickedRows.remove(clickedIndex.row())
record = TableViewModel.row_clicked(TableViewModel, clickedIndex)
TableView.clickedData.remove(record)