去除QComboBox下拉菜单阴影

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nxb593427560/article/details/81039804

首先, 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); //成功去掉阴影

猜你喜欢

转载自blog.csdn.net/nxb593427560/article/details/81039804