You have to use a QProxyStyle to establish that the painting of the selected items is the same when the view is focused or not.
from PyQt5 import QtGui, QtWidgets class ProxyStyle(QtWidgets.QProxyStyle): def drawPrimitive(self, element, option, painter, widget=None): if element == QtWidgets.QStyle.PE_PanelItemViewRow: if option.state & QtWidgets.QStyle.State_Selected: option.state |= QtWidgets.QStyle.State_Active super().drawPrimitive(element, option, painter, widget) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) tablewidget = QtWidgets.QTableWidget(10, 6) model = QtGui.QStandardItemModel(10, 6) tableview = QtWidgets.QTableView() tableview.setModel(model) for table in ( tablewidget, tableview, ): table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) table.setStyle(ProxyStyle(table.style())) w = QtWidgets.QWidget() lay = QtWidgets.QHBoxLayout(w) lay.addWidget(tablewidget) lay.addWidget(tableview) w.show() sys.exit(app.exec_())
You can also use a delegate:
from PyQt5 import QtGui, QtWidgets class Delegate(QtWidgets.QStyledItemDelegate): def initStyleOption(self, option, index): super().initStyleOption(option, index) if option.state & QtWidgets.QStyle.State_Selected: option.state |= QtWidgets.QStyle.State_Active if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) tablewidget = QtWidgets.QTableWidget(10, 6) model = QtGui.QStandardItemModel(10, 6) tableview = QtWidgets.QTableView() tableview.setModel(model) for table in ( tablewidget, tableview, ): table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) delegate = Delegate(table) table.setItemDelegate(delegate) w = QtWidgets.QWidget() lay = QtWidgets.QHBoxLayout(w) lay.addWidget(tablewidget) lay.addWidget(tableview) w.show() sys.exit(app.exec_())