背景
有些时候QCombox 选项内容都是固定好的,并且有一些业务逻辑和下拉内用的顺序存在一定的瓜葛,这时候由于种种原因需要隐藏一些选项。下面介绍的方法相比较将QCombox中的列表内容清空在重新加进去,方便实用的多。并且显示的项目的索引值不会发生变化,相关的业务逻辑不用更改
实现
bool disable =true;
QListView* view = qobject_cast<QListView *>(ui->comboBox->view());
view->setRowHidden(1,true);
实现的原理是QCombox也是基于Qt 的MVC 模式实现,里面有个QAbstractItemView *view()函数,通过这个函数获取到view 然后进项相关的操作。上面qobject_cast<QListView *> 也可以强转为其他类型的view 然后进行相关的设置也能达到目的。
注意:这里有个bug点,虽然实现了项目的隐藏,但是通过选中QCombox控件,然后滚动鼠标滚轮,仍然能显示隐藏的的项目
解决办法:
- 重写QCombox的滚轮事件
void QComboBox::wheelEvent(QWheelEvent *e)
{
//什么也不做
}
- 安装事件过滤器
//控件安装过滤器
ui->comboBox->installEventFilter(this)
bool XXXX::eventFilter(QObject *target, QEvent *event)
{
//屏蔽鼠标滚轮事件
if(event->type() == QEvent::Wheel&&(target->inherits("QComboBox")))
{
//什么也不做
return true;
}
return false;
}