闲谈
QT本身的下拉框已经非常的使用,例如当下拉框下拉是低于屏幕下方时会自动的做出向上弹出的动作。今天我在使用下拉框的控件时就发现他没有办法在没有满足上面要求时做出上拉情况,QComboBox本身也没有接口去设置一直上拉的条件,所以查看QT的文档后发现,showPopup()这个接口时Virtual,可以重写定制因此有了今天这篇文章。文章来源地址https://uudwc.com/A/LakvV
实现原理
- 相对坐标和全局坐标
- 控件的移动
- 重写showPopup()
实现代码
//获取全局的动画属性
bool blOldAnimation = qApp->isEffectEnabled(Qt::UI_AnimateCombo);
//取消弹出显示动画,避免移动时出现下拉框下拉显示效果出现
qApp->setEffectEnabled(Qt::UI_AnimateCombo, false);
//下拉框的显示view()可以正常显示,缺少该语句不会显示下拉框的内容
QComboBox::showPopup();
//回复初始动画
qApp->setEffectEnabled(Qt::UI_AnimateCombo, blOldAnimation );
//获取QCombox的视图显示控件
QWidget* qwgtPopup= this->findChild<QWidget*>();
//获取屏幕坐标系
QList<QScreen *> qlistScreens= QGuiApplication::screens(); //多显示器
QRect qrectRect= qlistScreens.at(0)->geometry();
int iDeskTopWidth= qrectRect.width();
int iDeskTopHeight= qrectRect.height();
qDebug() << iDeskTopWidth<<iDeskTopHeight;
//获取相对于屏幕的坐标,如果不转换移动时会出现问题,this指的是当前的下拉框控件
QPoint qpointPos= this->mapToGlobal(QPoint(0,0));
qDebug()<<"当前位置"<<qpointPos;
//移动到指定区域
qwgtPopup->move(qpointPos.x(),qpointPos.y()-qwgtPopup->height());
后续
- 可以使用QListWidget和QStandardItem打配合定制下拉框
- 当然使用视图/模型的方法也能实现自定义的控件,不过建议采用这种方法时尽量使用代理去绘制图形(比较复杂的)。
文章来源:https://uudwc.com/A/LakvV