Selektierte Zeile farbig markieren (hihhlighten)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
chrimoe
User
Beiträge: 6
Registriert: Freitag 30. November 2018, 18:58

Hallo zusammen,
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)
       

   
Antworten