要实现在 TableWidget 中多选并同步取消勾选的功能,可以使用 QTableWidget 的 'itemChanged' 信号和 'setCheckState' 方法。

首先,需要将 TableWidget 的选择模式设置为多选模式:

tableWidget.setSelectionMode(QAbstractItemView.MultiSelection)

然后,连接 TableWidget 的 'itemChanged' 信号到一个槽函数:

tableWidget.itemChanged.connect(self.onItemChanged)

在槽函数中,可以获取到发生改变的 Item 的行号和列号,然后使用 'setCheckState' 方法将改变应用到其他选中行的相同列:

def onItemChanged(self, item):
    if item.checkState() == Qt.Checked:
        # 获取选中行的行号
        row = item.row()
        # 获取选中行的列数
        column = item.column()
        
        # 遍历选中的行
        for selectedItem in self.tableWidget.selectedItems():
            # 如果不是当前行的相同列,则取消勾选
            if selectedItem.row() != row and selectedItem.column() == column:
                selectedItem.setCheckState(Qt.Unchecked)

完整的示例代码如下:

from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QAbstractItemView
from PySide6.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.tableWidget = QTableWidget()
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setRowCount(5)
        self.tableWidget.setSelectionMode(QAbstractItemView.MultiSelection)

        for row in range(5):
            for column in range(2):
                item = QTableWidgetItem(f'Item {row}-{column}')
                item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                item.setCheckState(Qt.Unchecked)
                self.tableWidget.setItem(row, column, item)

        self.tableWidget.itemChanged.connect(self.onItemChanged)
        self.setCentralWidget(self.tableWidget)

    def onItemChanged(self, item):
        if item.checkState() == Qt.Checked:
            row = item.row()
            column = item.column()

            for selectedItem in self.tableWidget.selectedItems():
                if selectedItem.row() != row and selectedItem.column() == column:
                    selectedItem.setCheckState(Qt.Unchecked)


app = QApplication([])
window = MainWindow()
window.show()
app.exec()

原文地址: https://www.cveoy.top/t/topic/pkxS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录