QT 实现QComboBox上拉显示

闲谈

QT本身的下拉框已经非常的使用,例如当下拉框下拉是低于屏幕下方时会自动的做出向上弹出的动作。今天我在使用下拉框的控件时就发现他没有办法在没有满足上面要求时做出上拉情况,QComboBox本身也没有接口去设置一直上拉的条件,所以查看QT的文档后发现,showPopup()这个接口时Virtual,可以重写定制因此有了今天这篇文章。

实现原理

  • 相对坐标和全局坐标
  • 控件的移动
  • 重写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打配合定制下拉框
  • 当然使用视图/模型的方法也能实现自定义的控件,不过建议采用这种方法时尽量使用代理去绘制图形(比较复杂的)。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QComboBoxQt中常用的组合框控件,它可以用来显示一个下拉列表框,用户可以通过下拉列表框选择其中的选项。在实际开发中,我们经常需要对QComboBox进行定制,以适应不同的UI风格和需求。 一、修改下拉箭头样式 QComboBox的下拉箭头默认是一个灰色三角形,我们可以通过修改QComboBox的QSS样式表来改变箭头的颜色和形状。例如,下面的代码可以将箭头变为一个红色正方形: ``` QComboBox::drop-down { image: url(:/images/red_square.png); } ``` 其中,`:drop-down`是QComboBox的伪状态选择器,表示下拉箭头的部分;`url()`函数指定了箭头的图片路径。注意,这里使用的图片必须是一个正方形,否则可能会出现拉伸或失真的情况。 二、修改下拉列表框样式 QComboBox的下拉列表框默认是白色背景、黑色边框和灰色文字,我们可以通过修改QComboBox的QSS样式表来改变下拉列表框的颜色和样式。例如,下面的代码可以将下拉列表框变为蓝色背景、白色边框和红色文字: ``` QComboBox::drop-down { background-color: blue; } QComboBox QAbstractItemView { border: 2px solid white; background-color: blue; color: red; } ``` 其中,`QAbstractItemView`是QComboBox下拉列表框的子控件,我们通过修改它的QSS样式表来改变下拉列表框的样式。注意,为了避免出现不必要的滚动条,我们可以将`QAbstractItemView`的`QScrollBar`控件的QSS样式表设置为`background: none;`。 三、修改文本框样式 QComboBox的文本框默认是白色背景、黑色边框和黑色文字,我们可以通过修改QComboBox的QSS样式表来改变文本框的颜色和样式。例如,下面的代码可以将文本框变为灰色背景、白色边框和蓝色文字: ``` QComboBox { background-color: gray; color: blue; border: 2px solid white; } ``` 其中,`QComboBox`是QComboBox的主控件,我们通过修改它的QSS样式表来改变文本框的样式。 四、修改选中项样式 QComboBox的选中项默认是蓝色背景和白色文字,我们可以通过修改QComboBox的QSS样式表来改变选中项的样式。例如,下面的代码可以将选中项变为红色背景和黄色文字: ``` QComboBox::item:selected { background-color: red; color: yellow; } ``` 其中,`:item:selected`是QComboBox的伪状态选择器,表示选中项的部分;`background-color`属性指定了选中项的背景颜色,`color`属性指定了选中项的文字颜色。 以上是QComboBox的常见定制方法,你可以根据需要选取其中的一种或多种进行定制。同时,你也可以通过QSS样式表来修改其他Qt控件的样式,以实现UI的个性化定制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值