我的主窗口中有一个带有多个小部件的GUI。更具体地说,我有一个QTableWidget
和一个QTableView
包含可选行。如果我在第一张表中选择一行,然后在第二张表中选择另一行,则我将焦点放到第一张表上,因此所选行上没有蓝色背景。
我目前所拥有的是:
或这个:
我想要的是:
我怎样才能做到这一点 ?
最佳答案
您必须使用QProxyStyle来确定视图是否处于焦点状态时所选项目的绘制是相同的。
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_())
您还可以使用委托:
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_())