如何在qabstracttablemodel的某一行中加入下拉框?
时间: 2023-12-14 14:39:13 浏览: 150
使用QTableView显示本地字段信息
要在QAbstractTableModel的一行中添加下拉框,您需要在QTableView中使用QItemDelegate。 QItemDelegate是一个用于呈现和编辑单元格数据的委托类。您可以使用QComboBox作为下拉框编辑器,并在QItemDelegate中实现createEditor和setEditorData等方法来创建和设置下拉框。
下面是一个简单的示例:
```python
from PyQt5.QtCore import Qt, QModelIndex
from PyQt5.QtWidgets import QComboBox, QItemDelegate
class ComboBoxDelegate(QItemDelegate):
def __init__(self, items):
super().__init__()
self.items = items
def createEditor(self, parent, option, index):
editor = QComboBox(parent)
editor.addItems(self.items)
return editor
def setEditorData(self, editor, index):
value = index.model().data(index, Qt.EditRole)
editor.setCurrentText(value)
def setModelData(self, editor, model, index):
value = editor.currentText()
model.setData(index, value, Qt.EditRole)
```
在上面的示例中,我们创建了一个名为ComboBoxDelegate的QItemDelegate子类,它使用给定的项目列表初始化一个QComboBox编辑器。createEditor方法返回一个QComboBox实例,setEditorData方法从模型中获取当前值并将其设置为下拉框的当前文本,setModelData方法将所选项目作为模型的新值。
现在,您可以将ComboBoxDelegate实例分配给QTableView中的某一列,如下所示:
```python
from PyQt5.QtCore import Qt, QVariant, QAbstractTableModel
from PyQt5.QtWidgets import QApplication, QTableView
class MyTableModel(QAbstractTableModel):
def __init__(self, data):
super().__init__()
self._data = data
def rowCount(self, parent=QModelIndex()):
return len(self._data)
def columnCount(self, parent=QModelIndex()):
return len(self._data[0])
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
return QVariant(self._data[index.row()][index.column()])
elif role == Qt.EditRole:
return QVariant(self._data[index.row()][index.column()])
return QVariant()
if __name__ == '__main__':
app = QApplication([])
data = [['Item 1', 'Value 1'], ['Item 2', 'Value 2'], ['Item 3', 'Value 3']]
model = MyTableModel(data)
view = QTableView()
delegate = ComboBoxDelegate(['Value 1', 'Value 2', 'Value 3'])
view.setItemDelegateForColumn(1, delegate)
view.setModel(model)
view.show()
app.exec_()
```
在上面的示例中,我们创建了一个名为MyTableModel的QAbstractTableModel子类,它使用给定的数据列表初始化。然后,我们创建了一个QTableView实例,并使用setItemDelegateForColumn方法将ComboBoxDelegate实例分配给第二列。最后,我们将模型设置为视图的模型,并显示它。
阅读全文