QComboBox向上弹出

QComboBox的popup默认是向下弹出的,但是当我们想要popup向上弹出时就很无奈了,也没有API给你设置,没办法,就只能自己解决了。

重写showPopup函数

void MyQComboBox::showPopup() override
{ 
    QComboBox::showPopup(); 
    QWidget *popup = this->findChild<QFrame*>(); 
    popup->move(popup->x(),popup->y()-this->height()-popup->height()); 
}

但是发现效果并不理想,它会有个向下的动画,然后再向上弹出。虽然效果达到了,但体验不能差不是。

关闭弹窗的动画

class MyComboBox : public QComboBox
{
public:
	MyComboBox(QWidget *parent = nullptr) : QComboBox(parent)
	{
		this->view()->installEventFilter(this);
	}
	
protected:
	void showPopup() override
	{
		bool oldAnimationEffects = qApp->isEffectEnabled(Qt::UI_AnimateCombo);
		qApp->setEffectEnabled(Qt::UI_AnimateCombo, false);

		QComboBox::showPopup();
		qApp->setEffectEnabled(Qt::UI_AnimateCombo, oldAnimationEffects);
	}

	bool eventFilter(QObject *obj, QEvent *e) override
	{
		bool handled = false;
		if (e->type() == QEvent::Show)
		{
			if (obj == view())
			{
				QWidget *frame = findChild<QFrame*>();
				frame->move(frame->x(), frame->y() - this->height() - frame->height());
			}
		}

		if (!handled)
			handled = QComboBox::eventFilter(obj, e);

		return handled;
	}
};

这样就能实现向上弹出的QComboBox了,但是弹出时没有动画,显得有点僵硬,那么有没有其他更好的方案呢?这个就要靠大家一起思考了。小巷子再深,我相信大家还是有办法能把它找出来的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
如果你想让 QComboBox 向上显示下拉列表,可以使用 QComboBox 的 setView() 方法来设置一个 QAbstractItemView 对象,然后修改这个 QAbstractItemView 对象的样式表(StyleSheet)来实现。具体来说,你需要将 QComboBox 的下拉列表的样式设置为向上,然后将 QComboBox 的下拉箭头旋转 180 度,使其指向上方。例如,下面的代码演示了如何实现 QComboBox 向上显示下拉列表的效果: ``` QComboBox* comboBox = new QComboBox(); QAbstractItemView* view = comboBox->view(); view->setStyleSheet("QAbstractItemView {" "border: 1px solid gray;" "selection-background-color: lightgray;" "background-color: white;" "show-decoration-selected: 1;" "}" "QAbstractItemView::item {" "height: 20px;" "}" "QComboBox {" "border: 1px solid gray;" "border-radius: 3px;" "padding: 1px 18px 1px 3px;" "min-width: 6em;" "}" "QComboBox::drop-down {" "subcontrol-origin: padding;" "subcontrol-position: top right;" "width: 20px;" "border-left-width: 1px;" "border-left-color: gray;" "border-left-style: solid;" "border-top-right-radius: 3px;" "border-bottom-right-radius: 3px;" "}" "QComboBox::down-arrow {" "image: url(:/images/up_arrow.png);" "width: 12px;" "height: 12px;" "}" "QComboBox::down-arrow:on {" "top: 1px;" "left: 1px;" "}"); comboBox->setView(view); ``` 其中,QComboBox 的下拉列表的样式表被设置为: ``` QAbstractItemView {" "border: 1px solid gray;" "selection-background-color: lightgray;" "background-color: white;" "show-decoration-selected: 1;" "}" ``` 这里只设置了一些基本的样式,你可以根据需要进行修改。QComboBox 的样式表被设置为: ``` QComboBox {" "border: 1px solid gray;" "border-radius: 3px;" "padding: 1px 18px 1px 3px;" "min-width: 6em;" "}" ``` 这里设置了 QComboBox 的基本样式。QComboBox 的下拉箭头的样式被设置为: ``` QComboBox::drop-down {" "subcontrol-origin: padding;" "subcontrol-position: top right;" "width: 20px;" "border-left-width: 1px;" "border-left-color: gray;" "border-left-style: solid;" "border-top-right-radius: 3px;" "border-bottom-right-radius: 3px;" "}" ``` 这里设置了 QComboBox 的下拉箭头的样式,将其放置在 QComboBox 的右上角。QComboBox 的下拉箭头被旋转了 180 度,使其指向上方: ``` QComboBox::down-arrow {" "image: url(:/images/up_arrow.png);" "width: 12px;" "height: 12px;" "}" ``` 这里设置了 QComboBox 的下拉箭头的样式,使用了一个 up_arrow.png 的图片,并将其旋转了 180 度。如果你希望使用其他的图片或者样式,可以根据需要进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值