我的主窗口中有一个带有多个小部件的GUI。更具体地说,我有一个QTableWidget和一个QTableView包含可选行。如果我在第一张表中选择一行,然后在第二张表中选择另一行,则我将焦点放到第一张表上,因此所选行上没有蓝色背景。

我目前所拥有的是:

python - 专注于多个小部件-LMLPHP
或这个:
python - 专注于多个小部件-LMLPHP

我想要的是:

python - 专注于多个小部件-LMLPHP

我怎样才能做到这一点 ?

最佳答案

您必须使用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_())

10-06 15:08