QTableView添加checkbox的示例
时间: 2023-09-13 15:10:13 浏览: 259
以下是一个简单的示例代码,展示如何在QTableView中添加checkbox列:
```python
from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QCheckBox, QHBoxLayout
class MyModel(QAbstractTableModel):
def __init__(self, data, header, parent=None):
super().__init__(parent)
self._data = data
self._header = header
def rowCount(self, parent=QModelIndex()):
return len(self._data)
def columnCount(self, parent=QModelIndex()):
return len(self._data[0])
def headerData(self, section, orientation, role):
if role == Qt.DisplayRole and orientation == Qt.Horizontal:
return self._header[section]
def data(self, index, role=Qt.DisplayRole):
row, col = index.row(), index.column()
if role == Qt.DisplayRole:
return self._data[row][col]
elif role == Qt.CheckStateRole and col == 0:
return Qt.Checked if self._data[row][col] else Qt.Unchecked
def setData(self, index, value, role=Qt.EditRole):
row, col = index.row(), index.column()
if role == Qt.CheckStateRole and col == 0:
self._data[row][col] = value == Qt.Checked
self.dataChanged.emit(index, index)
return True
return False
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
data = [[True, 'Apple', 100], [False, 'Banana', 200], [True, 'Orange', 300]]
header = ['Selected', 'Fruit', 'Price']
self.model = MyModel(data, header)
table = QTableView()
table.setModel(self.model)
table.setItemDelegateForColumn(0, CheckBoxDelegate(table))
table.resizeColumnsToContents()
layout = QHBoxLayout(self)
layout.addWidget(table)
class CheckBoxDelegate(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
def paint(self, painter, option, index):
checkbox = QCheckBox(self)
checkbox.setChecked(index.data(Qt.CheckStateRole))
checkbox.setGeometry(option.rect)
checkbox.stateChanged.connect(lambda state: self.updateModel(index, state))
def updateModel(self, index, state):
self.parent().model.setData(index, state, Qt.CheckStateRole)
if __name__ == '__main__':
app = QApplication([])
window = MyWindow()
window.show()
app.exec_()
```
在这个示例中,我们创建了一个继承自QAbstractTableModel的模型类MyModel,它包含三列数据:第一列是checkbox列,其余两列是普通的文本列。我们通过重写data()和setData()函数来处理checkbox列的数据。
我们还创建了一个继承自QCheckBox的CheckBoxDelegate类,用于将checkbox绘制到单元格中,并将状态更改的信号传递给模型。最后,我们将CheckBoxDelegate设置为第一列的委托,并使用QHBoxLayout将QTableView添加到QWidget中。
运行该示例,您应该会看到一个包含checkbox列的QTableView。
阅读全文