QTableWidget 点击单元格显示一个复合控件的代码
时间: 2024-01-22 09:20:01 浏览: 25
可以通过实现一个自定义的委托类来显示复合控件,然后将该委托设置给 QTableWidget 中的指定列。以下是一个示例代码:
```python
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QComboBox, QStyledItemDelegate
class CustomDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
if index.column() == 1:
combo = QComboBox(parent)
combo.addItems(['Option 1', 'Option 2', 'Option 3'])
return combo
else:
return super().createEditor(parent, option, index)
def setEditorData(self, editor, index):
if index.column() == 1:
value = index.data(Qt.EditRole)
editor.setCurrentText(value)
else:
super().setEditorData(editor, index)
def setModelData(self, editor, model, index):
if index.column() == 1:
value = editor.currentText()
model.setData(index, value, Qt.EditRole)
else:
super().setModelData(editor, model, index)
class MainWindow(QTableWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Custom Delegate Example')
self.resize(400, 300)
self.setColumnCount(2)
self.setRowCount(3)
for i in range(self.rowCount()):
item = QTableWidgetItem(f'Item {i}')
self.setItem(i, 0, item)
delegate = CustomDelegate(self)
self.setItemDelegateForColumn(1, delegate)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
在该示例中,我们创建了一个自定义委托类 `CustomDelegate`,该类实现了 `createEditor`、`setEditorData` 和 `setModelData` 方法,用于创建编辑器、设置编辑器的初始值和将编辑器的值保存到数据模型中。在 `createEditor` 方法中,我们判断当前列是否为第二列,如果是,则创建一个 QComboBox 控件作为编辑器,否则使用默认的编辑器。然后在 `setEditorData` 方法中,我们设置 QComboBox 的初始值为当前单元格的值,最后在 `setModelData` 方法中,我们将 QComboBox 的当前值保存到数据模型中。
在 MainWindow 类的 `initUI` 方法中,我们创建了一个 QTableWidget 控件,并设置了两列和三行。然后我们创建了一个 `CustomDelegate` 实例,并将其设置为第二列的委托。
这段代码会在第二列的单元格中显示一个 QComboBox 控件,用户可以通过下拉菜单选择其中的选项。