【发布时间】:2019-12-12 11:36:44
【问题描述】:
我的主窗口中有一个带有多个小部件的 GUI。我有一个更具体的QTableWidget 和一个QTableView,其中包含可选择的行。如果我在第一个表中选择一行,然后在第二个表中选择另一个,我会失去对第一个表的关注,因此所选行上没有蓝色背景。
我目前拥有的是:
我想要的是这个:
我该怎么做?
【问题讨论】:
标签: python python-3.x pyqt pyqt5
我的主窗口中有一个带有多个小部件的 GUI。我有一个更具体的QTableWidget 和一个QTableView,其中包含可选择的行。如果我在第一个表中选择一行,然后在第二个表中选择另一个,我会失去对第一个表的关注,因此所选行上没有蓝色背景。
我该怎么做?
【问题讨论】:
标签: python python-3.x pyqt pyqt5
您必须使用 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_())
【讨论】:
您需要将qtablewidget 的itemSelectionChanged 信号连接到您有逻辑选择另一个小部件中的行的插槽。
类似
tblwidget.itemSelectionChanged.connect(handleSelection)
并在其中定义一个名为handleSelection 的插槽
def handleSelection(self):
.... logic for selecting the current row
.. of the other widget
【讨论】: