如何隐藏QComboBox项而不是清空它们
我找不到办法来隐藏 QComboBox
的选项。目前唯一能过滤掉选项的方法就是删除现有的选项(用 .clear()
方法)。然后再用 .addItem()
方法重新添加所有的选项,重新构建整个 QComboBox
。
我其实更希望能暂时隐藏这些选项,等需要的时候再把它们显示出来。请问在 QComboBox
中,能不能做到隐藏和显示选项呢?
7 个回答
使用 setVisible()
方法可以改变你对象的可见性:
.setVisible(False) # Not Visible
.setVisible(True) # Visible
虽然没有直接的方法可以隐藏QComboBox
中的某个选项,但你可以使用QComboBox::setItemData
这个功能,把选项的大小设置为(0,0),这样就可以把这个选项隐藏起来了:
comboBox->setItemData(row, QSize(0,0), Qt::SizeHintRole);
接着 @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);
如果还有人正在寻找答案:
默认情况下,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)
你可以使用 removeItem()
方法来从 QComboBox
中移除一个项目。
void QComboBox::removeItem ( int index )
这个方法会根据你给定的索引(位置)从下拉框中移除对应的项目。如果你移除了某个项目,当前选中的项目也会更新。
如果你给的索引超出了范围,这个方法就不会做任何事情。
如果你不知道具体的索引,可以使用 findText()
方法来查找。
对于 QComboBox
中的项目,没有隐藏或显示的方法。