QCombox隐藏下拉箭头,并使其文本右对齐

使用场景

工作中,有时需要将QCombox做一些处理,比如此篇的隐藏其下拉箭头,将文本右对齐,展现的效果如QLabel的效果一样,但是却拥有其QCombox的信号。也有一种可能就是之前原有的程序设计为QCombox且可以下拉点击,但是由于需求变更,不再需要下拉框,下拉箭头,这时又要其文本保持右对齐。
显示效果如下:
在这里插入图片描述
下面是实现QCombox隐藏下拉箭头其文本居右显示;

实现代码

void setComboxEquivalentLineEdit(QComboBox *pCombox)
{
    
    
    pCombox->setStyleSheet(
        "QComboBox{border:1px red solid;}QComboBox::drop-down "
        "{width:0px;border:1px red solid;}"//设置下拉箭头所在的框不显示,即:即使不显示下拉箭头,也不占用右侧空间
        "QComboBox::down-arrow{image:none;}");//设置不显示下拉箭头
    pCombox->setLineEdit(new QLineEdit);//需要添加行编辑器,否则无法设置对齐方式
    pCombox->lineEdit()->setAlignment(Qt::AlignRight);
    pCombox->lineEdit()->setStyleSheet("background:transparent;border:0px;");
}

额外补充

下面是设置QCombox中的文本向右对齐的函数(但是是对于不隐藏QCombox的下拉箭头的常规控件)。可根据QCombox中的文本宽度及图标宽度,自动调整文本,使其向右对齐。

void setComboBoxToRightAlign(QComboBox *pCmb)
{
    
    
    if (!pCmb)
    {
    
    
        return;
    }
    QFont font = pCmb->font();
    QFontMetrics metr(font);
    int currentTextWidth = metr.width(pCmb->currentText());
    int pIConWidth = pCmb->iconSize().width();
    int nWidth = currentTextWidth + pIConWidth + 3;
    int nLeft = pCmb->rect().width() - nWidth;
    nLeft = nLeft < 0 ? 0 : nLeft;
    QString sStyleOld = pCmb->styleSheet();
    QString sStyle = QString("QComboBox{ padding-left:%1px;}").arg(nLeft);
    sStyleOld = sStyleOld + sStyle;
    pCmb->setStyleSheet(sStyleOld);
    pCmb->update();
}

完整代码

下面是完整的代码实现。

开发环境

关于我的qt版本如下:
QT
使用的编译器MSVC2017 64bit:
在这里插入图片描述

项目创建类型

创建基于QT的应用程序。
在这里插入图片描述

项目结构

在这里插入图片描述

实现代码:

main.cpp

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QComboBox>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    
    
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
private:
    void comboxAddTextItem();
    void setComboxRightAlignmentHideArrow();
    void setComboBoxToRightAlign(QComboBox *pCmb);
private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

dialog.cpp

扫描二维码关注公众号,回复: 15227097 查看本文章
#include "dialog.h"
#include "ui_dialog.h"
#include <QLineEdit>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    
    
    ui->setupUi(this);
    comboxAddTextItem();
    //以下两行代码可选其中一行放开注释,查看效果
//    setComboxRightAlignmentHideArrow();
//    setComboBoxToRightAlign(ui->comboBox);
}

Dialog::~Dialog()
{
    
    
    delete ui;
}

void Dialog::comboxAddTextItem()
{
    
    
    QStringList strList;
    strList<<"dfhu"<<"dfgdfg"<<"assw";
    ui->comboBox->addItems(strList);
    ui->comboBox->setCurrentText("dfhu");
}

void Dialog::setComboxRightAlignmentHideArrow()
{
    
    
   ui->comboBox->setStyleSheet("QComboBox{border:1px red solid;}QComboBox::drop-down {width:0px;border:1px red solid;}");
   ui->comboBox->setLineEdit(new QLineEdit);
   ui->comboBox->lineEdit()->setAlignment(Qt::AlignRight);

}

void Dialog::setComboBoxToRightAlign(QComboBox *pCmb)
{
    
    
    if (!pCmb)
    {
    
    
        return;
    }
    QFont font = pCmb->font();
    QFontMetrics metr(font);
    int currentTextWidth = metr.width(pCmb->currentText());
    int pIConWidth = pCmb->iconSize().width();
    int nWidth = currentTextWidth + pIConWidth + 3;
    int nLeft = pCmb->rect().width() - nWidth;
    nLeft = nLeft < 0 ? 0 : nLeft;
    QString sStyleOld = pCmb->styleSheet();
    QString sStyle = QString("QComboBox{ padding-left:%1px;}").arg(nLeft);
    sStyleOld = sStyleOld + sStyle;
    pCmb->setStyleSheet(sStyleOld);
    pCmb->update();
}

运行效果

效果一

注释掉setComboBoxToRightAlign(ui->comboBox);这行,另一行放开:
运行效果:
在这里插入图片描述

效果二

注释掉setComboxRightAlignmentHideArrow();这行,另一行放开;
运行效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/blqzj214817/article/details/130990522