如何只允许在 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 中多次选择某些项目?的主要内容,如果未能解决你的问题,请参考以下文章

QTableWidget:只允许数字

是否可以在 QTableWidget 中只选择一项

只允许 QTableWidget 列中的值

如何检查是不是在 qtablewidget 中选中了复选框?

如何从索引列表中选择 QtableWidget 中的单元格

如何在 QTableWidget 中选择多行?