版权声明:本文为博主原创文章,未经博主允许不得转载。 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); //成功去掉阴影