QT 自定义ComboBox,实现下拉框文本颜色设置

最近在做项目中遇到需求,在下拉框中,文本需要设置不同的颜色,遂网上了解了一番后,得出以下代码,可以完美实现效果,现分享出来!

1.实现效果

2.自定义类

colorcombobox.h

#ifndef COLORCOMBOBOX_H
#define COLORCOMBOBOX_H

#include <QComboBox>
#include <QWidget>

// 自定义ComboBox类,用于控制当前项颜色
class ColorComboBox : public QComboBox {
    Q_OBJECT
public:
    explicit ColorComboBox(QWidget *parent = nullptr);

    /// 添加带颜色的项
    void addColorItem(const QString &text, const QColor &color = Qt::black);


private slots:
    /// 更新当前项颜色
    void updateCurrentItemColor(int index);


protected:
    // 重写paintEvent以绘制当前项
    void paintEvent(QPaintEvent *e) override;
};

#endif // COLORCOMBOBOX_H

colorcombobox.cpp

#include "colorcombobox.h"
#include "config/appinfo.h"



// 自定义委托类
class CustomColorDelegate : public QStyledItemDelegate {
public:
    CustomColorDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) { }
    ~CustomColorDelegate() override { }

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        QStyleOptionViewItem opt = option;
        initStyleOption(&opt, index);

        // 获取该项的颜色
        QVariant colorVar = index.data(Qt::UserRole + 1); // 使用UserRole+1存储颜色
        QColor textColor = colorVar.isValid() ? colorVar.value<QColor>() : Qt::black;

        // 检查是否选中
        if (opt.state & QStyle::State_Selected) {
            painter->fillRect(opt.rect, opt.palette.highlight().color());   // 使用高亮颜色填充背景
            painter->setPen(opt.palette.highlightedText().color());         // 设置高亮文本颜色
        } else {
            painter->fillRect(opt.rect, Qt::white); // 使用白色填充背景
            painter->setPen(textColor);             // 设置自定义文本颜色
        }

        // 绘制文本
        painter->drawText(opt.rect.adjusted(5, 0, 0, 0),
                          Qt::AlignVCenter | Qt::AlignLeft,
                          opt.text);
    }
};



ColorComboBox::ColorComboBox(QWidget *parent) : QComboBox(parent) {
    // 设置自定义委托
    setItemDelegate(new CustomColorDelegate(this));

    // 连接信号,当选择变化时更新当前项颜色
    connect(this, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &ColorComboBox::updateCurrentItemColor);
}



void ColorComboBox::addColorItem(const QString &text, const QColor &color) {
    addItem(text);
    setItemData(count() - 1, color, Qt::UserRole + 1); // 存储颜色
    setItemData(count() - 1, color, Qt::ForegroundRole); // 兼容旧代码

    // 如果这是第一项,设置当前颜色
    if (count() == 1) {
        setCurrentIndex(0);
    }
}



void ColorComboBox::updateCurrentItemColor(int index) {
    if (index < 0) return;

    // 获取当前项的颜色
    QVariant colorVar = itemData(index, Qt::UserRole + 1);
    if (colorVar.isValid()) {
        QColor color = colorVar.value<QColor>();

        // 设置当前项的颜色(通过样式表)
        setStyleSheet(QString(
            "QComboBox {"
            "   color: %1;"
            "   background-color: white;"
            "   border: 1px solid #ccc;"
            "   border-radius: 4px;"
            "   padding: 5px;"
            "}"
            "QComboBox::drop-down {"
            "   border: none;"
            "}"
        ).arg(color.name()));
    }
}


void ColorComboBox::paintEvent(QPaintEvent *e) {
    QComboBox::paintEvent(e);

    // 如果需要,可以在这里添加自定义绘制代码
}

3.使用

// 创建颜色ComboBox
ColorComboBox *colorCombo = new ColorComboBox(this);
colorCombo->addColorItem("", Qt::black);
colorCombo->addColorItem("合格", QColor("#32CD32"));    // 石灰绿色
colorCombo->addColorItem("不合格", Qt::red);            // 红色

// 设置初始选择
colorCombo->setCurrentIndex(0);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值