重新设置QLineEdit ,居中显示
重新设置QListWidget,居中下拉显示
设置样式进行微调
centerCombobox.h
#ifndef CENTERCOMBOBOX_H
#define CENTERCOMBOBOX_H
#include <QObject>
#include <QWidget>
#include <QComboBox>
#include <QLineEdit>
#include <QStyleFactory>
#include <QListWidget>
#include <QListWidgetItem>
#include <QEvent>
#include <QDebug>
#include <QTime>
//居中显示的下拉框
class centerCombobox : public QComboBox
{
Q_OBJECT
public:
explicit centerCombobox(QWidget *parent = nullptr);
void addItem(const QString &text);
void addItems(const QStringList &texts);
bool eventFilter(QObject *watched, QEvent *event);
virtual void showPopup();
virtual void hidePopup();
void setFont(const QFont &);
void initSheet();//初始化风格
private:
QLineEdit *lineEdit = 0;
QListWidget * listWidget = 0 ;
bool showP = false;
QTime timer;
signals:
};
#endif // CENTERCOMBOBOX_H
centerCombobox.cpp
#include "centerCombobox.h"
centerCombobox::centerCombobox(QWidget *parent) : QComboBox(parent)
{
this->setStyle(QStyleFactory::create("windowsvista"));
if(lineEdit == 0)
{
lineEdit = new QLineEdit(this);
lineEdit->setObjectName("lintEditAdptive");
lineEdit->setReadOnly(true);
lineEdit->setAlignment(Qt::AlignCenter);
lineEdit->setFocusPolicy(Qt::NoFocus);
connect(lineEdit,&QLineEdit::selectionChanged,[=]{
lineEdit->deselect();
});
}
this->setLineEdit(lineEdit);
if(listWidget == 0)
{
listWidget = new QListWidget (this);
listWidget->setObjectName("listWidgetAdptive");
this->setModel(listWidget->model());
this->setView(listWidget);
}
timer=QTime::currentTime();
}
void centerCombobox::addItem(const QString &text)
{
QFont font = this->font();
QListWidgetItem *item = new QListWidgetItem(text);
item->setTextAlignment(Qt::AlignCenter);
listWidget->addItem(item);
lineEdit->installEventFilter(this);
lineEdit->setFont(font);
listWidget->setFont(font);
this->setFont(font);
showP = false;
initSheet();
}
//
void centerCombobox::addItems(const QStringList &texts)
{
QFont font = this->font();
//listWidget->clear();
for(auto d:texts)
{
QListWidgetItem *item = new QListWidgetItem(d);
item->setTextAlignment(Qt::AlignCenter);
listWidget->addItem(item);
}
lineEdit->installEventFilter(this);
lineEdit->setFont(font);
listWidget->setFont(font);
this->setFont(font);
showP = false;
initSheet();
}
bool centerCombobox::eventFilter(QObject *target, QEvent *event)
{
if (target == lineEdit)
{
if(event->type() == QEvent::KeyPress)
{
return true;
}
if (event->type() == QEvent::MouseButtonPress
|| event->type() == QEvent::MouseButtonDblClick
|| event->type() == QEvent::TouchBegin)
{
if(this->isEnabled())
{
int msecs = timer.msecsTo(QTime::currentTime());
if(msecs > 50)
{
if(showP)
hidePopup();
else
showPopup();
}
}
return true;
}
}
return QComboBox::eventFilter(target, event);
}
void centerCombobox::showPopup()
{
showP = true;
timer=QTime::currentTime();
QComboBox::showPopup();
}
void centerCombobox::hidePopup()
{
showP = false;
timer=QTime::currentTime();
QComboBox::hidePopup();
}
void centerCombobox::setFont(const QFont &font)
{
lineEdit->setFont(font);
listWidget->setFont(font);
for(auto w:this->findChildren<QWidget*>())
{
w->setFont(font);
}
initSheet();
QComboBox::setFont(font);
}
//初始化风格
void centerCombobox::initSheet()
{
int h = this->height();
QString sheet = QString("QComboBox{\
background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(250, 250, 250, 255), stop:0.5 rgba(240, 240, 240, 255), stop:1 rgba(230, 230, 230, 255));\
border: 1px solid rgb(200, 200, 200);\
border-radius: 4px;\
padding-left:%4px;\
}QComboBox:focus {border:1px solid rgb(65,173,255);\
}QComboBox::drop-down {width:%3px;border-image: url(:/image/icons/downarrow.png);\
}QComboBox QAbstractItemView {background-color:rgba(250, 250, 250, 255);\
}QComboBox QAbstractItemView::item {height: %1px;\
}QComboBox QAbstractScrollArea QScrollBar:vertical {width: %2px;\
}").arg(0.9*h).arg(0.6*h).arg(h).arg(h);
this->setStyleSheet(sheet);
this->setModel(listWidget->model());
}
下拉框箭头图片: