在pyqt中qtableview如何插入按钮
时间: 2023-06-06 15:02:33 浏览: 381
在 PyQt 的 QTableView 中插入按钮,可以通过自定义 QItemDelegate 实现。
具体实现步骤如下:
1. 创建自定义的 QItemDelegate 类,并重写 createEditor() 和 setEditorData() 两个函数,用于创建和显示按钮。
2. 在 QTableView 中设置相应的 QItemDelegate,该设置可以通过 setItemDelegate() 函数实现。在设置之前,需要先获取需要设置的 QTableView 的 model,并将其与自定义的 QItemDelegate 关联。
3. 在 model 的 data() 函数中设置需要插入的按钮,返回一个 QVariant 类型的值,以便在 QTableView 中显示。
具体实现代码如下:
```
from PyQt5 import QtCore, QtGui, QtWidgets
class MyButton(QtWidgets.QPushButton):
def __init__(self, text, parent=None):
super(MyButton, self).__init__(text, parent)
def paintEvent(self, event):
painter = QtWidgets.QStylePainter(self)
painter.drawControl(QtWidgets.QStyle.CE_PushButton, self.get_style_option())
def get_style_option(self):
opt = QtWidgets.QStyleOptionButton()
opt.initFrom(self)
return opt
class ButtonDelegate(QtWidgets.QItemDelegate):
def __init__(self, parent=None):
super(ButtonDelegate, self).__init__(parent)
def createEditor(self, parent, option, index):
button = MyButton('Button', parent)
button.clicked.connect(self.btnClicked)
return button
def setEditorData(self, editor, index):
pass
def btnClicked(self):
print('Button Clicked')
class MyTableModel(QtCore.QAbstractTableModel):
def __init__(self, data):
super(MyTableModel, self).__init__()
self._data = data
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable
def rowCount(self, parent):
return len(self._data)
def columnCount(self, parent):
return len(self._data[0])
def data(self, index, role):
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return str(self._data[index.row()][index.column()])
elif role == QtCore.Qt.TextAlignmentRole:
return QtCore.Qt.AlignCenter
elif role == QtCore.Qt.BackgroundRole:
return QtGui.QColor(224, 224, 224)
elif role == QtCore.Qt.CheckStateRole:
return QtCore.Qt.Unchecked
elif role == QtCore.Qt.UserRole:
return 'Button'
return None
def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
return 'Col{}'.format(section+1)
else:
return 'Row{}'.format(section+1)
return None
if __name__ == '__main__':
app = QtWidgets.QApplication([])
w = QtWidgets.QTableView()
data = [
[1, 2],
[3, 4]
]
model = MyTableModel(data)
delegate = ButtonDelegate(w)
w.setModel(model)
w.setItemDelegate(delegate)
w.show()
app.exec_()
```
以上代码实现了一个简单的 QTableView,并在其中的一列中插入了所有单元格都相同的按钮。当用户点击该按钮时,会在控制台输出相应的信息。
阅读全文