去除QComboBox下拉菜单阴影

首先, QComboBox的下拉菜单也是属于QWidget的子类, 而在QWidget中, 可以设置调用setWindowFLag(Qt::NoDropShadowWindowHint)来去除阴影效果. 那么现在的问题就是, 如何找到QComboBox中的这个QWidget了.

通过查看Qt源码发现, 原有的下拉列表是一个继承自QListView的QComboBoxListView, 在头文件qcombobox_p.h中.  

那是否设置QComboBoxListView的windowFlag就行呢? 但是通过以下代码发现并没有效果:

comboBox->view()->setWindowFLag(Qt::NoDropShadowWindowHint);

还是有边框, 还是有阴影. 再看看源码:

原来是QComboBoxListView放在QComboBoxPrivateContainer中, QComboBoxPrivateContainer继承自QFrame, 又包装了一层. 那得到这个QComboBoxPrivateContainer再设置它的windowFlag就以解决了吗? 

但是在QComboBox中,并没有直接接口获取到这个对象. 不能直接那就拐个弯吧-.- 源码中的实现是, 在构造QComboBoxPrivateContainer对象时, 需传入QComboBoxListView对象, 初始化本身windowFlag为Qt::Popup, 并将QComboBoxListView对象的parent设置为QComboBoxPrivateContainer对象.  于是就有以下代码:

QListView* comboBoxView = comboBox->view();    //QComboBoxListView对象
QWidget* containerObj = static_cast<QWidget*>(comboBoxView->parent()); // QComboBoxPrivateContainer对象
containerObj->setWindowFLag(Qt::NoDropShadowWindowHint); //成功去掉阴影

Note: 如果使用自定义代理, 比如使用QListWidget替代QComboBoxListView:

comboBox->setModel(listWidget->model());    // 必须在setView之前
comboBOx->setView(listWidget);        //必须在setWindowFlag之前
QListView* comboBoxView = comboBox->view();    //QComboBoxListView对象
QWidget* containerObj = static_cast<QWidget*>(comboBoxView->parent()); // QComboBoxPrivateContainer对象
containerObj->setWindowFLag(Qt::NoDropShadowWindowHint); //成功去掉阴影
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值