今天碰到一個有意思的問題,在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);
}