PyQt5 – 如何获得组合框模型中的可见列

  • Post category:Python

在使用 PyQt5 的 QComboBox 组件时,如果设置了组合框的模型,可以通过 QAbstractItemModel 以编程方式插入或删除项目和修改格式等。

如果组合框中的模型包含多个列,则可以使用代码获得模型中的可见列,并及时更新列表。

下面是一个简单的示例程序,展示如何使用 PyQt5 获得 QComboBox 的模型中的可见列:

import sys
from PyQt5.QtWidgets import QApplication, QComboBox
from PyQt5.QtGui import QStandardItemModel, QStandardItem

class ComboBox(QComboBox):
    def __init__(self):
        super().__init__()

        self.model = QStandardItemModel()
        self.model.setColumnCount(3)

        for i in range(5):
            item = QStandardItem(f'item {i}')
            item.setIcon(QIcon("icons/delete.png"))
            self.model.appendRow([item, QStandardItem(f'value {i}'), QStandardItem(f'description {i}')])

        self.setModel(self.model)

        self.model.setHorizontalHeaderLabels(['Item', 'Value', 'Description'])
        self.model.setVerticalHeaderLabels([f'Row {i}' for i in range(5)])

    def get_visible_columns(self):
        columns = []

        for i in range(self.model.columnCount()):
            if not self.isColumnHidden(i):
                columns.append(i)

        return columns

app = QApplication(sys.argv)
combo_box = ComboBox()
combo_box.show()
print(combo_box.get_visible_columns())
sys.exit(app.exec_())

上面的代码创建了一个 QComboBox,设置了一个包含 3 个列的 QStandardItemModel 模型,并添加了 5 个行。

在 get_visible_columns 方法中,使用 isColumnHidden 方法遍历模型的所有列,筛选出可见列,将可见列添加到一个列表中,最终返回列表。

打印输出列表中的列号,即可在控制台中查看模型中的可见列。

另一个示例程序中,使用 QComboBox 的 currentIndexChanged 事件,当下拉列表中的项更改时,自动更新模型中的数据。代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QComboBox
from PyQt5.QtGui import QStandardItemModel, QStandardItem

class ComboBox(QComboBox):
    def __init__(self):
        super().__init__()

        self.model = QStandardItemModel()
        self.model.setColumnCount(3)

        for i in range(5):
            item = QStandardItem(f'item {i}')
            item.setIcon(QIcon("icons/delete.png"))
            self.model.appendRow([item, QStandardItem(f'value {i}'), QStandardItem(f'description {i}')])

        self.setModel(self.model)

        self.model.setHorizontalHeaderLabels(['Item', 'Value', 'Description'])
        self.model.setVerticalHeaderLabels([f'Row {i}' for i in range(5)])

        self.currentIndexChanged.connect(self.update_model)

    def update_model(self, index):
        item = self.model.item(index, 0)
        item.setText(f'item updated {index}')
        self.model.item(index, 1).setText(f'value updated {index}')
        self.model.item(index, 2).setText(f'description updated {index}')

app = QApplication(sys.argv)
combo_box = ComboBox()
combo_box.show()
sys.exit(app.exec_())

在上面的代码中,使用 currentIndexChanged 事件,当下拉列表中的项更改时,触发 update_model 方法。update_model 方法根据当前选中的项的索引更新模型中的数据,并使用 setText 方法更新对应的项的值。

综上所述,以上两个示例展示了在 PyQt5 中如何获得 QComboBox 的模型中的可见列及如何自动更新模型中的数据。