我找不到隐藏QComboBox物品的方法。到目前为止,过滤其项目的唯一方法是删除现有项目(使用.clear()方法)。然后QComboBox使用它的.addItem()方法再次重建整个。

我宁愿暂时隐藏物品。当需要他们取消隐藏时。是否可以完成对 QCombobox 项目的隐藏/取消隐藏?

如果有人仍在寻找答案:

默认情况下,QComboBox用于QListView显示弹出列表并QListView具有setRowHidden()方法:

qobject_cast<QListView *>(comboBox->view())->setRowHidden(0, true);

编辑:Python 版本:

# hide row
view = comboBox.view()
view.setRowHidden(row, True)

# disable item
model = comboBox.model()
item = model.item(row)
item.setFlags(item.flags() & ~Qt.ItemIsEnabled

# enable item
view.setRowHidden(row, false)
item.setFlags(item.flags() | Qt.ItemIsEnabled)

默认情况下,QComboBox 将使用 QListView 作为视图,因此您可以执行以下操作:

QListView* view = qobject_cast<QListView *>(combo->view());
Q_ASSERT(view != nullptr);
view->setRowHidden(row, true);

上述的一个缺点是,即使该项目将从弹出窗口中隐藏,用户仍然可以使用鼠标滚轮选择它。为了克服这个问题,为隐藏行添加以下内容:

QStandardItemModel* model = qobject_cast<QStandardItemModel*>(combo->model());
Q_ASSERT(model != nullptr);
QStandardItem* item = model->item(row);
item->setFlags(item->flags() & ~Qt::ItemIsEnabled);

使用上面的行将被隐藏,用户将无法使用鼠标滚轮滚动到它。

要取消隐藏它,只需执行相反的操作:

view->setRowHidden(row, false);
item->setFlags(item->flags() | Qt::ItemIsEnabled);