我在主窗口中有一个带有多个小部件的GUI。更具体地说,我有一个QTableWidget
和一个QTableView
,其中包含可选行。如果我在第一张表中选择一行,然后在第二张表中选择另一行,则我将焦点放到第一张表上,因此所选行上没有蓝色背景。
我该怎么做?
您需要将itemSelectionChanged
的qtablewidget
信号连接到一个插槽,在该插槽中您可以选择另一个小部件中的行。
类似
tblwidget.itemSelectionChanged.connect(handleSelection)
并在其中定义一个名为handleSelection
的插槽
def handleSelection(self):
.... logic for selecting the current row
.. of the other widget
您必须使用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_())