QComboBox的showPopup和hidePopup

今天碰到一個有意思的問題,在QComboBox彈出下拉的listView之後,你選中一個,上下拖動,然後你移出listview的控件範圍,竟然不會hide,這樣的話如果在item較小時,喜歡拖動的用戶簡直崩潰,所以我看了一下QComboBox的show和hide,最終重寫了一下showPopup和hidePopup

#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H

#include <QEvent>
#include <QDebug>
#include <QWidget>
#include <QComboBox>

class myComboBoX : public QComboBox
{
    Q_OBJECT
public:
    explicit myComboBoX(QWidget *p);
    ~myComboBoX();
protected:
    void showPopup();
    void hidePopup();
    bool eventFilter ( QObject * o, QEvent * e ) ;
};

#endif // MYCOMBOBOX_H
#include "mycombobox.h"

myComboBoX::myComboBoX(QWidget *p):QComboBox(p)
{
    /* 開啓鼠標追蹤 */
    setMouseTracking(true);
}

myComboBoX::~myComboBoX()
{

}
/* 下拉view的調用顯示函數 */
void myComboBoX::showPopup()
{
    /*1、默認彈出view,不改變  */
    QComboBox::showPopup();
    /*2、獲取view的parent  */
    QWidget *popup = this->findChild<QFrame*>();
    /*3、設置QFrame的name,其實有沒有沒區別,爲了嚴謹  */
    popup->setObjectName("popup");
    /*4、加入事件過濾  */
    popup->installEventFilter(this);
}

/* 下拉view的調用隱藏函數 */
void myComboBoX::hidePopup()
{
    /*1、清除之前的配置  */
    QWidget *popup = this->findChild<QFrame*>();
    popup->setObjectName("");
    popup->removeEventFilter(this);
    /*2、隱藏  */
    QComboBox::hidePopup();
}

bool myComboBoX::eventFilter(QObject *o, QEvent *e)
{
    if(o->objectName() == "popup"){
        if(e->type() == QEvent::Leave){
            if(view() != NULL){
                /* 沒有這一句會默認你顯示前的index */
                int curIndex = view()->currentIndex().row();
                setCurrentIndex(curIndex);
            }
            hidePopup();
            return true;
        }
    }
    return QComboBox::eventFilter(o,e);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章