【问题标题】:Change state of checkbox programmatically in qtableview在 qtableview 中以编程方式更改复选框的状态
【发布时间】:2020-04-20 03:24:17
【问题描述】:

我发现这个模型可以用复选框来可视化 qtableview。它可以工作,但现在我还想以编程方式更改复选框的状态(例如,选中/取消选中所有复选框的按钮)。我不知道我该怎么做......

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class TableModel(QAbstractTableModel):
    def __init__(self, parent=None):
        super(TableModel, self).__init__(parent)
        self.tableData = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
        self.checks = {}

    def columnCount(self, *args):
        return 3

    def rowCount(self, *args):
        return 3

    def checkState(self, index):
        if index in self.checks.keys():
            return self.checks[index]
        else:
            return Qt.Unchecked

    def data(self, index, role=Qt.DisplayRole):
        row = index.row()
        col = index.column()
        if role == Qt.DisplayRole:
            return '{0}'.format(self.tableData[row][col])
        elif role == Qt.CheckStateRole and col == 0:
            return self.checkState(QPersistentModelIndex(index))
        return None

    def setData(self, index, value, role=Qt.EditRole):

        if not index.isValid():
            return False
        if role == Qt.CheckStateRole:
            self.checks[QPersistentModelIndex(index)] = value
            return True
        return False

    def flags(self, index):
        fl = QAbstractTableModel.flags(self, index)
        if index.column() == 0:
            fl |= Qt.ItemIsEditable | Qt.ItemIsUserCheckable
        return fl

【问题讨论】:

    标签: python pyqt pyqt4 qtableview qabstracttablemodel


    【解决方案1】:

    您必须使用setData() 方法,在此方法中,当与角色关联的值发生变化时,必须发出dataChanged 信号:

    def setData(self, index, value, role=Qt.EditRole):
        if not index.isValid():
            return False
        if role == Qt.CheckStateRole:
            self.checks[QPersistentModelIndex(index)] = value
            self.dataChanged.emit(index, index)
            return True
        return False

    如果您想选中和取消选中项目,您必须遍历这些项目:

    class Widget(QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
    
            self.button = QPushButton("Checked", checkable=True)
            self.button.clicked.connect(self.on_clicked)
    
            self.view = QTableView()
            self.model = TableModel(self)
            self.view.setModel(self.model)
    
            lay = QVBoxLayout(self)
            lay.addWidget(self.button)
            lay.addWidget(self.view)
    
        @pyqtSlot(bool)
        def on_clicked(self, state):
            c = 0
            for r in range(self.model.rowCount()):
                ix = self.model.index(r, c)
                self.model.setData(
                    ix, Qt.Checked if state else Qt.Unchecked, Qt.CheckStateRole
                )
            self.button.setText("Unchecked" if state else "Checked")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-25
      • 2016-11-05
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多