py qt 如何给treeview每一行添加按钮
时间: 2023-12-24 09:04:18 浏览: 54
在 `PyQt5` 中,可以通过自定义 `QStyledItemDelegate` 来实现给 `QTreeView` 的每一行添加按钮。具体的实现步骤如下:
1. 定义 `QStyledItemDelegate` 子类,并重写其 `createEditor()`、`setEditorData()` 和 `setModelData()` 方法,在 `createEditor()` 方法中创建按钮,`setEditorData()` 方法中设置按钮的文本,`setModelData()` 方法中将按钮的文本保存到数据模型中。
2. 在 `QTreeView` 中设置该自定义 `QStyledItemDelegate`。
下面是一个简单的示例代码:
```python
from PyQt5.QtWidgets import QApplication, QTreeView, QStyledItemDelegate, QPushButton, QStyleOptionViewItem, \
QStyle, QAbstractItemView
from PyQt5.QtCore import QModelIndex, Qt
class ButtonDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index: QModelIndex):
button = QPushButton(parent)
button.setText(index.data())
return button
def setEditorData(self, editor, index: QModelIndex):
editor.setText(index.data())
def setModelData(self, editor, model, index: QModelIndex):
model.setData(index, editor.text())
def updateEditorGeometry(self, editor, option, index: QModelIndex):
editor.setGeometry(option.rect)
if __name__ == '__main__':
app = QApplication([])
tree_view = QTreeView()
# 设置 QTreeView 的数据模型
model = QStandardItemModel()
root_item = model.invisibleRootItem()
for i in range(3):
parent = QStandardItem(f'parent {i}')
for j in range(4):
child = QStandardItem(f'child {j}')
parent.appendRow(child)
root_item.appendRow(parent)
tree_view.setModel(model)
# 设置 QTreeView 的委托
delegate = ButtonDelegate()
tree_view.setItemDelegate(delegate)
# 允许多选
tree_view.setSelectionMode(QAbstractItemView.ExtendedSelection)
tree_view.show()
app.exec_()
```
在这个示例中,我们自定义了一个 `ButtonDelegate` 类,该类继承自 `QStyledItemDelegate`,并重写了 `createEditor()`、`setEditorData()` 和 `setModelData()` 方法。在 `createEditor()` 方法中创建按钮,并将按钮设置为该单元格的编辑器;在 `setEditorData()` 方法中设置按钮的文本;在 `setModelData()` 方法中将按钮的文本保存到数据模型中。
然后在主函数中,我们创建了一个 `QTreeView`,并设置其数据模型。然后设置 `ButtonDelegate` 为 `QTreeView` 的委托,使得每个单元格都有一个按钮。最后我们允许多选,并展示 `QTreeView`。
希望这个示例能够帮助你实现你的需求。