Qt 继承QComboBox 居中下拉框

 

重新设置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());
}

 

下拉框箭头图片: 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值