QT 实现QComboBox上拉显示

闲谈

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://blog.csdn.net/qq_44811295/article/details/127593981

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年09月25日 05:02
下一篇 2023年09月25日 05:06