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

6 投票
7 回答
14393 浏览
提问于 2025-04-18 16:19

我找不到办法来隐藏 QComboBox 的选项。目前唯一能过滤掉选项的方法就是删除现有的选项(用 .clear() 方法)。然后再用 .addItem() 方法重新添加所有的选项,重新构建整个 QComboBox

我其实更希望能暂时隐藏这些选项,等需要的时候再把它们显示出来。请问在 QComboBox 中,能不能做到隐藏和显示选项呢?

7 个回答

0

使用 setVisible() 方法可以改变你对象的可见性:

.setVisible(False) # Not Visible
.setVisible(True) # Visible
1

虽然没有直接的方法可以隐藏QComboBox中的某个选项,但你可以使用QComboBox::setItemData这个功能,把选项的大小设置为(0,0),这样就可以把这个选项隐藏起来了:

comboBox->setItemData(row, QSize(0,0), Qt::SizeHintRole);
8

接着 @kef 的回答说:

(请原谅在 Python 问题中用到了 C++)

默认情况下,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);
14

如果还有人正在寻找答案:

默认情况下,QComboBox 使用 QListView 来显示下拉列表,而 QListView 有一个叫 setRowHidden() 的方法:

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

补充:根据 @Tobias Leupold 的评论修正了代码。
补充: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)
1

你可以使用 removeItem() 方法来从 QComboBox 中移除一个项目。

void QComboBox::removeItem ( int index )

这个方法会根据你给定的索引(位置)从下拉框中移除对应的项目。如果你移除了某个项目,当前选中的项目也会更新。

如果你给的索引超出了范围,这个方法就不会做任何事情。

如果你不知道具体的索引,可以使用 findText() 方法来查找。

对于 QComboBox 中的项目,没有隐藏或显示的方法。

撰写回答