如何在QTableWidget中选择多行?

2024-05-23 17:58:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个启用了扩展选择的表:

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,我的问题中的代码工作得很好。


Tags: 代码iniduidatatableitemrow
3条回答

在本例中,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,我将获得您描述的行为

您需要在每个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)

通过临时设置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)

相关问题 更多 >