如何在QTableWidget中选择多行?

3

我有一个表格,已启用ExtendedSelection:

table.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)

当我关闭UI时,我使用QSettings来记住任何选择的行。当我重新打开我的UI时,我希望它能自动重新选择这些行。

我有以下代码,但只会选择最后选定的一行:

QSETTINGS = [1, 2, 3]  # Indicates row 1, 2 and 3 should be selected

for row in xrange(table.rowCount()):
    table_item = table.item(row, 1)
    row_data = table_item.data(QtCore.Qt.UserRole)
    row_id = row_data
    if row_id in QSETTINGS:
        table.selectRow(row)  # This ends up only making one row selected

如何用除了table.selectRow(row)之外的方法来选择多个行?


编辑

在我的原问题中,我说我使用的是QtGui.QAbstractItemView.MultiSelection。然而,我没有使用。我使用的是QtGui.QAbstractItemView.ExtendedSelection,这也是为什么我的行选择代码显然不起作用的原因。通过暂时切换到MultiSelection,选择行,然后切换回ExtendedSelection,我的问题中的代码工作得很好。

4个回答

8

通过临时设置“MultiSelection”选择模式,可以选择每一行。

QSETTINGS = [1, 2, 3]  # Indicates row 1, 2 and 3 should be selected

# Temporarily set MultiSelection
table.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)

for row in xrange(table.rowCount()):
    table_item = table.item(row, 1)
    row_data = table_item.data(QtCore.Qt.UserRole)
    row_id = row_data
    if row_id in QSETTINGS:
        table.selectRow(row)  # This ends up only making one row selected

# Revert MultiSelection to ExtendedSelection
table.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)

顺便提一下,如果您选择所有行,似乎这是一个简单的方法来执行反选。感谢您的回答! - Green Cell

1

您需要在每个 QTableWidgetItem 上使用 setSelected

for row in xrange(table.rowCount()):
    table_item = table.item(row, 1)
    row_data = table_item.data(QtCore.Qt.UserRole)
    row_id = row_data
    if row_id in QSETTINGS:
        for col in table.columnCount():
            item = table.item(row, col)
            if item:
                item.setSelected(True)

1

PyQt是在通常的Qt库之上的一种包装器。以下是实现问题答案的步骤。

步骤1:打开QTableWidget文档

步骤2:在滚动文档后了解到表格是由项目的矩形组织的

步骤3:了解可以通过rowCountcolumnCount获得行数和列数

步骤4:了解可以通过QTableWidget::item从特定行和列获取项目

步骤5:打开QTableWidgetItem文档

步骤五:发现有一个方法QTableWidgetItem::setSelected

最后,你可以创建如下代码:

for r in range(tblMy.rowCount()):
    for c in range(tblMy.columnCount()):
        item = tblMy.item(r, c)
        isSelected = ...
        item.setSelected(isSelected)

顺便说一下,即使PyQt的文档质量不佳或者不理想,通常的Qt文档也是非常丰富的。


0
在这个例子中,table.selectRow(i) 可以用于多选:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class MyTableWidget(QtWidgets.QTableWidget):
    def __init__(self, parent = None):
        QtWidgets.QTableWidget.__init__(self, parent)
        self.setRowCount(5)
        self.setColumnCount(3)
        self.items = [['a1','b1', 'c1'], ['a2','b2','c2'], ['a3','b3','c3'], ['a4','b4','c4'], ['a5','b5','c5']]
        self.hh = ['a', 'b','c']
        self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
        selected = [1,2,4]
        self.setSel(selected)

        for r in range(0,len(self.items)):
            for c in range(0,len(self.items[0])):
                item = QtWidgets.QTableWidgetItem()
                item.setText(self.items[r][c])
                item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable)
                self.setItem(r,c,item)

    def setSel(self, selection):
        for i in selection:
            self.selectRow(i)

app = QtWidgets.QApplication(sys.argv) 
widget = MyTableWidget()
widget.show()
sys.exit(app.exec_())

我理解您所描述的情况。如果我在设置选择后调用setSelectionMode,会出现这种行为。

抱歉,我使用的是 ExtendedSelection 而不是 MultiSelection。现在我明白了为什么我的代码只选择了一行。这是因为我没有使用 MultiSelection。所以暂时设置一下应该就可以解决我的问题了。 - fredrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接