头文件
#include <QStyledItemDelegate>
#include <QLineEdit>
#include <QComboBox>
#include <QMouseEvent>
class ComboBoxDelegate : public QStyledItemDelegate
{
public:
ComboBoxDelegate(QObject * parent = 0);
void paint(QPainter * painter, const QStyleOptionViewItem & option,
const QModelIndex & index) const;
};
class PopupLineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit PopupLineEdit(QWidget* parent = 0);
explicit PopupLineEdit(const QString &str, QWidget* parent = 0);
~PopupLineEdit();
Q_SIGNAL void clicked();
protected:
void mouseReleaseEvent(QMouseEvent *);
void mouseDoubleClickEvent(QMouseEvent *);
};
class CenterComboBox : public QComboBox
{
Q_OBJECT
public:
explicit CenterComboBox(QWidget *parent = 0);
~CenterComboBox();
Q_SLOT void popupTop();
};
代码实现
#include "CenterComboBox.h"
#include <QListView>
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QPoint>
#include <QPainter>
ComboBoxDelegate::ComboBoxDelegate(QObject * parent)
: QStyledItemDelegate(parent)
{
}
void ComboBoxDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QString str = index.data().toString();
QStyleOptionViewItem myOption = option;
myOption.displayAlignment = Qt::AlignCenter;
QStyledItemDelegate::paint(painter, myOption, index);
}
PopupLineEdit::PopupLineEdit(QWidget* parent) : QLineEdit(parent)
{
}
PopupLineEdit::PopupLineEdit(const QString &str, QWidget* parent)
: QLineEdit(parent)
{
}
PopupLineEdit::~PopupLineEdit()
{
}
void PopupLineEdit::mouseReleaseEvent(QMouseEvent *)
{
emit clicked();
}
void PopupLineEdit::mouseDoubleClickEvent(QMouseEvent *)
{
}
CenterComboBox::CenterComboBox(QWidget *parent)
: QComboBox(parent)
{
PopupLineEdit* lineEdit = new PopupLineEdit(this);
lineEdit->setReadOnly(true);
lineEdit->setAlignment(Qt::AlignCenter);
setLineEdit(lineEdit);
connect(lineEdit, SIGNAL(clicked()), this, SLOT(popupTop()));
ComboBoxDelegate *delegate = new ComboBoxDelegate(this);
setItemDelegate(delegate);
setMaxVisibleItems(20);
}
CenterComboBox::~CenterComboBox()
{
}
void CenterComboBox::popupTop()
{
if (count() <= 1)
return;
showPopup();
QWidget *popup = this->findChild<QFrame*>();
QPoint pos = mapToGlobal(QPoint(0,0));
popup->move(popup->x(), pos.y() - popup->height());
}