如何隐藏 QComboBox 项目而不是清除它们

alp*_*ric 4 python pyqt

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

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

Kef*_*Kef 11

如果有人仍在寻找答案:

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

qobject_cast<QListView *>(comboBox->view())->setRowHidden(0, true);
Run Code Online (Sandbox Code Playgroud)

编辑:根据@Tobias Leupold 的评论修复代码。
编辑:Python 版本:

qobject_cast<QListView *>(comboBox->view())->setRowHidden(0, true);
Run Code Online (Sandbox Code Playgroud)

  • --此方法还有另一个警告^虽然该项目将不可见并且无法通过鼠标单击,但仍然可以通过滚轮和键盘访问它。--在发表评论之前应该再次阅读整个线程=) (2认同)

CJC*_*ink 8

以@kef 的回答为基础:

(请原谅关于python问题的C++)

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

QListView* view = qobject_cast<QListView *>(combo->view());
Q_ASSERT(view != nullptr);
view->setRowHidden(row, true);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

view->setRowHidden(row, false);
item->setFlags(item->flags() | Qt::ItemIsEnabled);
Run Code Online (Sandbox Code Playgroud)


eso*_*ton 1

您可以使用该removeItem()方法从 中删除项目QComboBox

void QComboBox::removeItem ( int index )

从组合框中删除给定索引处的项目。如果删除索引,这将更新当前索引。

如果索引超出范围,此函数不会执行任何操作。

如果您不知道索引,请使用该findText()方法。

项目没有隐藏/取消隐藏方法QComboBox

  • 这是关于隐藏条目,而不是删除它......请参阅下面的答案了解如何执行此操作 (qobject_cast&lt;QListView *&gt;(combobox-&gt;view())-&gt;setRowHidden(0, true);) (2认同)