py qt QTreeView (QStandardItemModel) 中怎么在每行节点前以及末尾添加两个按钮
时间: 2024-03-09 12:47:10 浏览: 98
可以通过自定义 QStyledItemDelegate 实现在每行节点前以及末尾添加两个按钮。
首先,需要自定义一个 QStyledItemDelegate,并重写其 paint() 和 sizeHint() 方法。在 paint() 方法中,可以通过 painter 绘制每行节点前以及末尾的按钮;在 sizeHint() 方法中,可以设置每行的高度。
然后,在使用 QTreeView 显示数据时,将自定义的 QStyledItemDelegate 设置给 QTreeView 的 itemDelegate() 方法即可。
下面是一个简单的示例代码,仅供参考:
```python
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon, QPainter
from PyQt5.QtWidgets import QStyledItemDelegate, QTreeView, QStandardItemModel, QApplication, QPushButton
class MyItemDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
if index.column() == 0:
# 在每行节点前添加按钮
btn1 = QPushButton(QIcon('icon1.png'), '')
btn1.setGeometry(option.rect.x(), option.rect.y(), 20, 20)
btn1.setStyleSheet('QPushButton{border:none;}')
btn1.show()
if index.column() == index.model().columnCount() - 1:
# 在每行节点末尾添加按钮
btn2 = QPushButton(QIcon('icon2.png'), '')
btn2.setGeometry(option.rect.right() - 20, option.rect.y(), 20, 20)
btn2.setStyleSheet('QPushButton{border:none;}')
btn2.show()
# 绘制节点内容
super().paint(painter, option, index)
def sizeHint(self, option, index):
# 设置每行的高度
size = super().sizeHint(option, index)
size.setHeight(30)
return size
if __name__ == '__main__':
app = QApplication([])
model = QStandardItemModel()
for i in range(5):
item = QStandardItem(f'Item {i}')
model.appendRow(item)
tree_view = QTreeView()
tree_view.setModel(model)
# 设置自定义的 QStyledItemDelegate
delegate = MyItemDelegate()
tree_view.setItemDelegate(delegate)
tree_view.show()
app.exec_()
```
在上述示例中,我们重写了 QStyledItemDelegate 的 paint() 和 sizeHint() 方法,并在 paint() 方法中绘制了每行节点前以及末尾的按钮,并在 sizeHint() 方法中设置了每行的高度。
然后,在使用 QTreeView 显示数据时,将自定义的 QStyledItemDelegate 设置给 QTreeView 的 itemDelegate() 方法即可。
需要注意的是,示例中绘制按钮的方式可能不够完美,可以根据实际需求进行更改。
阅读全文