how to set hover effect on hovered row?
-
import sys from PySide2.QtGui import QColor, QBrush, QCursor, QPainter, QPen, QFont from PySide2.QtWidgets import QStyledItemDelegate, QApplication, QTableView, QAbstractItemView, QStyle from PySide2.QtCore import Qt, QModelIndex, QAbstractTableModel, QEvent class TBV(QTableView): def __init__(self) -> None: super().__init__() self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setMouseTracking(True) class DEG(QStyledItemDelegate): def __init__(self, parent=None) -> None: super().__init__(parent) def paint(self, painter, option, index: QModelIndex) -> None: if index.column() == 0: data = index.model().data(index, Qt.DisplayRole) painter.save() painter.setRenderHint(QPainter.Antialiasing, True) painter.setPen(QPen(QBrush(QColor(Qt.blue)), 1)) font = QFont('Courier', 13) painter.setFont(font) painter.drawText(option.rect, Qt.AlignCenter, data) painter.restore() else: return super().paint(painter, option, index) def initStyleOption(self, option, index): super().initStyleOption(option, index) model = index.model() col = index.column() view = self.parent() if option.state & QStyle.State_MouseOver: option.backgroundBrush = QBrush(Qt.red) else: pos = view.viewport().mapFromGlobal(QCursor.pos()) for c in range(model.columnCount()): if c != col: r = view.visualRect(index.siblingAtColumn(c)) if r.adjusted(0, 0, 1, 1).contains(pos): option.backgroundBrush = QBrush(Qt.red) break class MDL(QAbstractTableModel): def __init__(self, parent=None) -> None: super().__init__(parent) self._tabledata = [['mike', 12], ['kk', 13], ['jane', 14]] def rowCount(self, parent: QModelIndex = ...) -> int: return len(self._tabledata) def columnCount(self, parent: QModelIndex = ...) -> int: return len(self._tabledata[0] if self._tabledata else []) def data(self, index: QModelIndex, role: int = ...): if not index.isValid(): return None if 0 == self.rowCount(): return None if index.row() >= self.rowCount(): return None if role == Qt.DisplayRole or role == Qt.EditRole: return self._tabledata[index.row()][index.column()] else: return None if __name__ == '__main__': app = QApplication(sys.argv) demo = TBV() demo.setItemDelegate(DEG(demo)) model = MDL(demo) demo.setModel(model) demo.show() sys.exit(app.exec_())
here is a Qtableview rendered by
QStyledItemDelegate
, how to set hovered effect on the hovered row?