PYQT5中,table表下拉多选
时间: 2024-01-29 10:01:49 浏览: 26
在PyQt5中,可以使用QComboBox和QTableWidget来创建一个表格下拉多选控件。
首先,创建一个QTableWidget并在其中添加一个QComboBox,然后为QComboBox设置一个模型,该模型允许多个选择。接下来,将QComboBox添加到表格中的相应单元格中。
以下是一个简单的示例代码,演示如何创建一个带有下拉多选控件的表格:
```python
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QComboBox, QStyledItemDelegate
from PyQt5.QtCore import Qt, QAbstractItemModel
class MultiSelectionModel(QAbstractItemModel):
def __init__(self, options):
super().__init__()
self.options = options
self.selections = []
def rowCount(self, index):
return len(self.options)
def columnCount(self, index):
return 1
def index(self, row, column, parent):
return self.createIndex(row, column)
def parent(self, index):
return QModelIndex()
def data(self, index, role):
if role == Qt.DisplayRole:
return self.options[index.row()]
elif role == Qt.CheckStateRole:
return Qt.Checked if index.row() in self.selections else Qt.Unchecked
def setData(self, index, value, role):
if role == Qt.CheckStateRole:
if value == Qt.Checked:
self.selections.append(index.row())
else:
self.selections.remove(index.row())
self.dataChanged.emit(index, index)
return True
return False
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
class TableWithMultiSelection(QTableWidget):
def __init__(self, options, parent=None):
super().__init__(parent)
self.options = options
delegate = QStyledItemDelegate(self)
self.setItemDelegateForColumn(0, delegate)
self.setColumnCount(1)
self.setRowCount(len(options))
for i, option in enumerate(options):
self.setItem(i, 0, QTableWidgetItem())
index = self.model().index(i, 0, QModelIndex())
self.setCellWidget(i, 0, self.createComboBox(index))
self.resizeColumnsToContents()
self.resizeRowsToContents()
def createComboBox(self, index):
comboBox = QComboBox()
model = MultiSelectionModel(self.options)
comboBox.setModel(model)
comboBox.currentIndexChanged.connect(lambda: self.comboBoxIndexChanged(index, comboBox))
return comboBox
def comboBoxIndexChanged(self, index, comboBox):
row = index.row()
column = index.column()
value = comboBox.currentText()
self.item(row, column).setText(value)
def getSelectedOptions(self, row):
comboBox = self.cellWidget(row, 0)
model = comboBox.model()
return [model.options[i] for i in model.selections]
```
在这个示例中,我们创建了一个名为TableWithMultiSelection的子类,该类继承自QTableWidget。在构造函数中,我们为表格的每一行创建一个QComboBox,并将其添加到表格中的相应单元格中。我们还为每个QComboBox设置了一个MultiSelectionModel模型,该模型允许多个选择。在MultiSelectionModel中,我们重载了一些方法来实现QComboBox的多选功能。
最后,我们可以调用getTableWidgetSelectedOptions方法来获取所选选项的列表,该方法接受一个行索引作为参数,该行包含QComboBox。