首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在QTableView的列中显示下拉列表并根据下拉列表进行过滤

在QTableView的列中显示下拉列表并根据下拉列表进行过滤,可以通过以下步骤实现:

  1. 创建一个自定义的QStyledItemDelegate,重写其paint()和createEditor()方法,使其在单元格中显示下拉列表。
代码语言:python
复制
class ComboBoxDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        options = QStyleOptionComboBox()
        options.rect = option.rect
        options.currentText = index.data()
        options.state = QStyle.State_Enabled
        if option.state & QStyle.State_Selected:
            options.state |= QStyle.State_Selected
        QApplication.style().drawComplexControl(QStyle.CC_ComboBox, options, painter)

    def createEditor(self, parent, option, index):
        editor = QComboBox(parent)
        editor.addItems(index.data())
        return editor
  1. 在QTableView中设置自定义的QStyledItemDelegate。
代码语言:python
复制
table_view = QTableView()
delegate = ComboBoxDelegate()
table_view.setItemDelegateForColumn(column_index, delegate)
  1. 设置QTableView的模型,并将数据填充到表格中。
代码语言:python
复制
model = QStandardItemModel()
table_view.setModel(model)

# 填充数据
for row in range(row_count):
    for column in range(column_count):
        item = QStandardItem(data[row][column])
        model.setItem(row, column, item)
  1. 在QTableView的模型中添加过滤功能,根据下拉列表的选择过滤表格数据。
代码语言:python
复制
class FilterProxyModel(QSortFilterProxyModel):
    def __init__(self, parent=None):
        super(FilterProxyModel, self).__init__(parent)
        self.filters = {}

    def setFilter(self, column, value):
        self.filters[column] = value
        self.invalidateFilter()

    def filterAcceptsRow(self, source_row, source_parent):
        model = self.sourceModel()
        for column, value in self.filters.items():
            index = model.index(source_row, column, source_parent)
            if index.data() != value:
                return False
        return True
  1. 将QTableView的模型设置为FilterProxyModel,并将FilterProxyModel的源模型设置为QTableView的模型。
代码语言:python
复制
filter_proxy_model = FilterProxyModel()
filter_proxy_model.setSourceModel(model)
table_view.setModel(filter_proxy_model)
  1. 在下拉列表的currentIndexChanged()信号中,根据下拉列表的选择过滤表格数据。
代码语言:python
复制
editor = QComboBox()
editor.addItems(['Option 1', 'Option 2', 'Option 3'])
editor.currentIndexChanged.connect(lambda: filter_proxy_model.setFilter(column_index, editor.currentText()))

通过以上步骤,可以在QTableView的列中显示下拉列表并根据下拉列表进行过滤。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券