вот собственно код виджета выбора цвета:
Код:
#ifndef COLORWIDGET_H
#define COLORWIDGET_H
#include <QWidget>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QContextMenuEvent>
#include <QMenu>
#include <QAction>
class ColorWidget : public QWidget
{
Q_OBJECT
private:
int column_count;
int size_item; // Размер элемента (сторона квадрата)
QColor _color; // Выбранный цвет
QVector<QColor> items; // Хранит цвета ячеек
int select_item; // Индекс выбранной ячейки
QMenu *context_menu;
QAction *act_add;
QAction *act_remove;
QAction *act_replaced;
public:
explicit ColorWidget(int column_count = 13, QWidget *parent = 0);
~ColorWidget();
// Размер элемента
int sizeItem();
// Цвет выбранного элемента
QColor color();
// Число колонок
int columnCount();
// Число строк
int rowCount();
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *e);
void contextMenuEvent(QContextMenuEvent *e);
signals:
// Высылается при выборе цвета
void changedColor(QColor col);
public slots:
// Устанавливает число колонок
void setColumnCount(int column_count = 13);
// Устанавливает размер элемента
void setSizeItem(int size_item = 20);
// Добавляет элемент, заданного цвета
void addItem(QColor col);
// Добавляет элемент. При этом, для выбора цвета, открывается окно QColorDialog
void addItem();
// Изменяет цвет элемента. При этом, для выбора цвета, открывается окно QColorDialog
void replacedColor();
// Удаляет элемент
void removeColor();
};
#endif // COLORWIDGET_H
Код:
#include "color_widget.h"
#include <QPainter>
#include <QColorDialog>
#include <QBrush>
#include <QRect>
#include <QDebug>
ColorWidget::ColorWidget(int column_count, QWidget *parent) :
QWidget(parent)
{
this->column_count = column_count;
resize(column_count * size_item, rowCount() * size_item);
size_item = 20;
select_item = 0;
act_add = new QAction(tr("Add Color"), this);
act_remove = new QAction(tr("Remove Color"), this);
act_replaced = new QAction(tr("Replaced Color"), this);
context_menu = new QMenu(this);
context_menu->addAction(act_add);
context_menu->addAction(act_remove);
context_menu->addAction(act_replaced);
connect(act_add, SIGNAL(triggered()), SLOT(addItem()));
connect(act_replaced, SIGNAL(triggered()), SLOT(replacedColor()));
connect(act_remove, SIGNAL(triggered()), SLOT(removeColor()));
// Добавляем цвета. Этот кусок кода скорее всего будет другим
items.push_back(QColor(255, 0, 0)); // 0
items.push_back(QColor(255, 155, 0)); // 1
items.push_back(QColor(255, 255, 0)); // 2
items.push_back(QColor(175, 255, 0)); // 3
items.push_back(QColor(0, 255, 0)); // 4
items.push_back(QColor(0, 255, 155)); // 5
items.push_back(QColor(0, 255, 255)); // 6
items.push_back(QColor(0, 155, 255)); // 7
items.push_back(QColor(0, 0, 255)); // 8
items.push_back(QColor(155, 0, 255)); // 9
items.push_back(QColor(255, 0, 255)); // 10
items.push_back(QColor(255, 155, 255));// 11
items.push_back(QColor(255, 255, 255));// 12
for(float k = 1.25f; k < 3.5f; k += 0.25f)
for(int i = 0; i < 13; i++)
{
int r, g, b;
r = items[i].red() / k;
g = items[i].green() / k;
b = items[i].blue() / k;
items.push_back(QColor(r, g, b));
}
items[items.size() - 1] = QColor(0, 0, 0); // Последний элемент черный
}
ColorWidget::~ColorWidget()
{
}
void ColorWidget::setColumnCount(int column_count)
{
this->column_count = column_count;
update();
}
void ColorWidget::setSizeItem(int size_item)
{
this->size_item = size_item;
update();
}
int ColorWidget::sizeItem()
{
return size_item;
}
QColor ColorWidget::color()
{
return _color;
}
int ColorWidget::columnCount()
{
return column_count;
}
int ColorWidget::rowCount()
{
int count = items.size() / column_count;
if(items.size() % column_count)
count++;
return count;
}
void ColorWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
for(int i = 0, x = 0, y = 0; i < items.size(); i++, x++)
{
painter.setBrush(QBrush(items[i]));
if(x == column_count)
{
x = 0;
y++;
}
painter.drawRect(QRect(QPoint(x * size_item, y * size_item),
QPoint(x * size_item + size_item, y * size_item + size_item)));
}
}
void ColorWidget::mousePressEvent(QMouseEvent *e)
{
int row = e->y() / size_item;
int column = e->x() / size_item;
if(row < rowCount() && column < column_count)
select_item = row * column_count + column;
if(e->button() == 1)
{
_color = items[select_item];
emit changedColor(_color);
}
}
void ColorWidget::contextMenuEvent(QContextMenuEvent *e)
{
int row = e->y() / size_item;
int column = e->x() / size_item;
if(row < rowCount() && column < column_count)
{
select_item = row * column_count + column;
context_menu->exec(e->globalPos());
}
}
void ColorWidget::addItem(QColor col)
{
items.push_back(col);
resize(column_count * size_item + 10, rowCount() * size_item + 10);
}
void ColorWidget::addItem()
{
QColor col = QColorDialog::getColor();
if(!col.isValid())
return;
addItem(col);
}
void ColorWidget::replacedColor()
{
QColor col = QColorDialog::getColor();
if(!col.isValid())
return;
items[select_item] = col;
update();
}
void ColorWidget::removeColor()
{
items.remove(select_item);
update();
}