如何只允许在 QTableWidget 中多次选择某些项目?
Posted
技术标签:
【中文标题】如何只允许在 QTableWidget 中多次选择某些项目?【英文标题】:How to only allow certain items to be multiple selected in a QTableWidget? 【发布时间】:2016-03-24 09:16:53 【问题描述】:我有一个 QTableWidget 并且希望项目可以根据已选择的内容进行选择(仅当它们在第二列中具有相同的内容时)。
我知道如何使项目可选择或不可选择。但是一切都应该保持可选状态,以便用户可以选择单个项目来重新开始选择。只有通过按住 shift 或 ctrl 来添加到选择中才应该只允许/选择合适的项目。
我在哪里可以挂钩以使添加到选择只接受合适的行?
注意:我使用的是 PySide,但我可以使用 C++ 或 PyQt 代码正常工作。
【问题讨论】:
也许你可以继承 QItemSelectionModel 然后呢?重载选择可能会让我半途而废,但理想情况下,当按下 shift 时,我什至不希望项目显示为可选择的。每次按下 cttrl/shift 时更改 ItemIsSelectable 标志似乎很糟糕。 “当鼠标悬停在项目上时,项目显示为可选”是什么意思?在我看来,当鼠标悬停在可选择项目和不可选择项目上时,它们之间没有任何区别。我认为您可以重载QItemSelectionModel
的两个select
方法并根据已选择的项目选择项目(但不确定,我从未做过这样的事情)
你是对的,可选择和不可选择的项目在鼠标悬停时看起来是一样的。但是启用的图标会变成浅蓝色,未启用的项目会变成浅灰色。所以我要改变 ItemIsEnabled 标志而不是 ItemIsSelectable。
【参考方案1】:
您可以连接到QTableWidget.itemSelectionChanged
信号并根据选择修改表中所有其他项目的Qt.ItemIsSelectable
标志。
from itertools import product
table = QtGui.QTableWidget()
table.itemSelectionChanged.connect(self.on_itemSelectionChanged)
@QtCore.pyqtSlot()
def on_itemSelectionChanged(self):
sel_items = self.table.selectedItems()
# get all items in table
items = []
for r, c in product(range(self.table.rowCount()), range(self.table.columnCount())):
items.append(self.table.item(r, c)
# Loop through all the items in the table and
# set the selection flag based of already selected items.
for item in items:
if can_be_selected:
item.setFlags(item.flags() | QtCore.Qt.ItemIsSelectable)
else:
item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable)
【讨论】:
那么你不能选择(没有 shift 或 ctrl)一个新的项目来替换当前的选择。 “can_be_selected”取决于当前选择被替换或扩展的天气。 您只需要在进行新选择之前取消选择当前选择。以上是关于如何只允许在 QTableWidget 中多次选择某些项目?的主要内容,如果未能解决你的问题,请参考以下文章