colorlistwidget.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // colorlistwidget.cpp
  2. #include "colorlistwidget.h"
  3. #include <QHeaderView>
  4. #include <QPainter>
  5. #include <QStyledItemDelegate>
  6. #include <QTableWidget>
  7. #include <QVBoxLayout>
  8. // 自定义的ColorDelegate用于绘制颜色块
  9. class ColorDelegate : public QStyledItemDelegate
  10. {
  11. public:
  12. explicit ColorDelegate(QObject *parent = nullptr)
  13. : QStyledItemDelegate(parent)
  14. {}
  15. void paint(QPainter *painter,
  16. const QStyleOptionViewItem &option,
  17. const QModelIndex &index) const override
  18. {
  19. if (index.column() == 1) {
  20. QColor color = index.data(Qt::DisplayRole).value<QColor>();
  21. // 绘制背景
  22. painter->save();
  23. painter->setRenderHint(QPainter::Antialiasing);
  24. // 绘制颜色块
  25. QRect rect = option.rect.adjusted(2, 2, -2, -2);
  26. painter->setPen(Qt::darkGray);
  27. painter->setBrush(color);
  28. painter->drawRoundedRect(rect, 4, 4);
  29. // 显示颜色值文本
  30. painter->setPen(color.lightness() > 128 ? Qt::black : Qt::white);
  31. painter->drawText(rect,
  32. Qt::AlignCenter,
  33. color.name(QColor::NameFormat::HexArgb).toUpper());
  34. painter->restore();
  35. } else {
  36. QStyledItemDelegate::paint(painter, option, index);
  37. }
  38. }
  39. QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
  40. {
  41. return QSize(120, 28); // 统一单元格尺寸
  42. }
  43. };
  44. ColorListWidget::ColorListWidget(QWidget *parent)
  45. : QWidget(parent)
  46. , table(new QTableWidget(this))
  47. {
  48. setupUI();
  49. }
  50. void ColorListWidget::setupUI()
  51. {
  52. // 表格设置
  53. table->setColumnCount(2);
  54. table->setHorizontalHeaderLabels({"Color Name", "Color Value"});
  55. table->verticalHeader()->setVisible(false);
  56. table->horizontalHeader()->setStretchLastSection(true);
  57. table->setSelectionMode(QAbstractItemView::NoSelection);
  58. table->setEditTriggers(QAbstractItemView::NoEditTriggers);
  59. // 设置列宽
  60. table->setColumnWidth(0, 150);
  61. table->setColumnWidth(1, 200);
  62. // 设置颜色列代理
  63. table->setItemDelegateForColumn(1, new ColorDelegate(this));
  64. // 布局
  65. QVBoxLayout *layout = new QVBoxLayout(this);
  66. layout->addWidget(table);
  67. layout->setContentsMargins(0, 0, 0, 0);
  68. }
  69. void ColorListWidget::setColors(const QHash<QString, QColor> &colors)
  70. {
  71. table->setRowCount(colors.size());
  72. // 获取排序后的颜色名称列表
  73. QStringList colorNames = colors.keys();
  74. std::sort(colorNames.begin(), colorNames.end(), [](const QString &a, const QString &b) {
  75. // 先按字母顺序排序
  76. // 特殊处理带数字的键(如primary_1, primary_2)
  77. return QString::compare(a, b, Qt::CaseInsensitive) < 0;
  78. // 如果需要数字顺序排序(primary_1 < primary_2),可以使用:
  79. // return a.compare(b, Qt::CaseInsensitive) < 0;
  80. });
  81. int row = 0;
  82. for (const QString &name : colorNames) {
  83. const QColor color = colors.value(name);
  84. // 颜色名称
  85. QTableWidgetItem *nameItem = new QTableWidgetItem(name);
  86. nameItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  87. table->setItem(row, 0, nameItem);
  88. // 颜色值(存储QColor对象)
  89. QTableWidgetItem *colorItem = new QTableWidgetItem;
  90. colorItem->setData(Qt::DisplayRole, color);
  91. table->setItem(row, 1, colorItem);
  92. ++row;
  93. }
  94. // 自动调整行高
  95. table->resizeRowsToContents();
  96. }