最近在做項目中遇到需求,在下拉框中,文本需要設置不同的顏色,遂網上了解了一番后,得出以下代碼,可以完美實現效果,現分享出來!
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);