美文网首页
QComboBox向上弹出

QComboBox向上弹出

作者: BrokenRainK | 来源:发表于2019-08-09 15:37 被阅读0次

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了,但是弹出时没有动画,显得有点僵硬,那么有没有其他更好的方案呢?这个就要靠大家一起思考了。小巷子再深,我相信大家还是有办法能把它找出来的。

相关文章

网友评论

      本文标题:QComboBox向上弹出

      本文链接:https://www.haomeiwen.com/subject/uvshjctx.html