Qt QComboBox内容居中

目录

1.初始化Mycombobox

2.安装事件管理器

3.事件管理器

4.使用方法

5.运行结果


1.初始化Mycombobox

1.往QComboBox中插入一个QLineEdit,通过QLineEdit的文本居中实现

//显示居中
    QLineEdit*lineEdit = box->lineEdit();
    if(lineEdit == 0)
    {
        lineEdit = new QLineEdit(box);
        lineEdit->setFixedWidth(width);
        lineEdit->setStyleSheet("background-color:transparent;border:none;");
        lineEdit->setObjectName("lintEditAdptive");
        lineEdit->setReadOnly(true);
        lineEdit->setAlignment(Qt::AlignCenter);
        lineEdit->setFocusPolicy(Qt::NoFocus);
        QLineEdit::connect(lineEdit,&QLineEdit::selectionChanged,[=]{
        lineEdit->deselect();
        if(!lineEdit->isVisible())
            box->showPopup();
        });

        QComboBox::connect(box,&QComboBox::currentTextChanged,[=](const QString &text){
           for(int i = 0; i < box->count(); i++)
           {
               if(box->itemText(i) == text)
               {
                   box->setCurrentIndex(i);
                   break;
               }
           }
        });
        box->setLineEdit(lineEdit);
    }

2.下拉列表居中

//下拉列表居中
    QStandardItemModel* model =  static_cast<QStandardItemModel*>(box->view()->model());
    if(model)
    {
        for(int i = 0; i < model->rowCount(); i ++)
        {
            if(model->item(i))
                model->item(i)->setTextAlignment(Qt::AlignCenter);
        }
    }

 3.加上默认样式设置完整代码

static void comboBoxInit(QComboBox*box,int width = 200,int height=30,bool bSheet=true)
{
    //显示居中
    QLineEdit*lineEdit = box->lineEdit();
    if(lineEdit == 0)
    {
        lineEdit = new QLineEdit(box);
        lineEdit->setFixedWidth(width);
        lineEdit->setStyleSheet("background-color:transparent;border:none;");
        lineEdit->setObjectName("lintEditAdptive");
        lineEdit->setReadOnly(true);
        lineEdit->setAlignment(Qt::AlignCenter);
        lineEdit->setFocusPolicy(Qt::NoFocus);
        QLineEdit::connect(lineEdit,&QLineEdit::selectionChanged,[=]{
        lineEdit->deselect();
        if(!lineEdit->isVisible())
            box->showPopup();
        });

        QComboBox::connect(box,&QComboBox::currentTextChanged,[=](const QString &text){
           for(int i = 0; i < box->count(); i++)
           {
               if(box->itemText(i) == text)
               {
                   box->setCurrentIndex(i);
                   break;
               }
           }
        });
        box->setLineEdit(lineEdit);
    }
    if(bSheet)//是否设置样式
    {
        int font = 16;
        int font_size = 19;
        QString sheet = QString(
                              "QComboBox {border:1px solid #cbcbcb;padding: 1px 12px 1px 2px;color: black;padding-left:0px;font: normal normal %1px Microsoft YaHei;background-color: rgb(247,247,247);}"
                              "QComboBox::drop-down {width:%2px;height:%3px;image: url(:/new/prefix1/pic/down_blue.png);subcontrol-origin: content ;subcontrol-position: center right;}"
                              "QComboBox QAbstractItemView {outline: 0px solid gray;border: 1px solid #cbcbcb;selection-background-color: rgb(135,165,214);font: normal normal %4px 黑体;font-size: %1px;}"
                              "QComboBox QAbstractItemView::item {height:%5px;width:%6px;}"
                              "QComboBox QAbstractItemView::item:hover {color: white;background-color:rgb(135,165,214);}"
                              "QComboBox QAbstractItemView::item:selected {color: white;background-color: rgb(135,165,214);}")
                    .arg(font).arg(15).arg(15).arg(font_size).arg(height).arg(width);

                box->setStyleSheet(sheet);
                box->setView(new QListView());
                box->view()->setCursor(Qt::PointingHandCursor);
        }

    //设置字体
    QFont font = box->font();
    for(auto w:box->findChildren<QWidget*>())
    {
        w->setFont(font);
    }
    //下拉列表居中
    QStandardItemModel* model =  static_cast<QStandardItemModel*>(box->view()->model());
    if(model)
    {
        for(int i = 0; i < model->rowCount(); i ++)
        {
            if(model->item(i))
                model->item(i)->setTextAlignment(Qt::AlignCenter);
        }
    }
};

2.安装事件管理器

static void comboBoxInstall(QComboBox* box,QObject*install){
    if(box)
    {
        QLineEdit* lineEdit = box->lineEdit();
        if(lineEdit)
        {
            box->installEventFilter(install);
            lineEdit->installEventFilter(install);
            box->setCursor(Qt::PointingHandCursor);
            lineEdit->setCursor(Qt::PointingHandCursor);
        }
    }
};

3.事件管理器

static bool comboBoxEventFilter(QObject *target, QEvent *event){
    static QComboBox*  curComboBox = 0;//操作的下拉框
    if(QString(target->metaObject()->className()) == "QComboBox")
    {
        QComboBox*  box =qobject_cast<QComboBox*>(target);
        if (box && event->type() == QEvent::FocusIn)
        {
            curComboBox = box;
        }
        else if (box && event->type() == QEvent::FocusOut)
        {
            curComboBox = nullptr;
        }
    }
    else if(QString(target->metaObject()->className()) == "QLineEdit")
    {
        if (event->type() == QEvent::MouseButtonRelease)
        {
            QComboBox*  box = qobject_cast<QComboBox*>(target->parent());
            if(box && box == curComboBox)
            {
                if(box->isEnabled())
                {
                    box->showPopup();
                }
            }
            return true;
        }
    }
    return false;
};

4.使用方法

默认设置了宽度和高度,需要修改的话直接设置即可

    MyComboBox::comboBoxInit(ui->comboBox);
    MyComboBox::comboBoxInstall(ui->comboBox,this);

重写 eventFilter

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if(MyComboBox::comboBoxEventFilter(object,event))
    {
        return true;
    }
    return false;
}

5.运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值