Последние записи
- Как копировать текст из блока в буфер обмена?
- Получение ProductKey установленной Windows
- Как парсить https сайт ?
- Смена регистра строки текста на BAT (CMD)
- Вывод разноцветного текста на BAT (CMD)
- Узнать дату окончания сертификата
- Как создать полноценный сайт на Open Server
- Получить температуру процессора на bat-файлах
- Динамические массивы в Lazarus / Delphi — индексация элементов
- Многозадачность на бат-файлах
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
13th
Июл
Qt виджет выбор цвета
Posted by obzor under QT
Есть ли в Qt виджет, выбора цвета? Не QColorDialog, а именно виджет, что бы его поместить в основную форму.
Вот запилил, на скорую руку. Виджет выбора цвета помещен в главную форму, с помощью лайаута, с права. Слева, в главном окне, расположены
спин-боксы для изменения числа колонок и размеров элементов. Так же лейбел, для отображения R G B выбранного цвета.
Имеет контекстное меню, для удаления, добавления и редактирования элементов
#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.red() / k;
g = items.green() / k;
b = items.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));
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();
}
#ifndef WIDGET_H
#define WIDGET_H
#include "color_widget.h"
#include <QSpinBox>
#include <QLabel>
class Widget : public QWidget
{
Q_OBJECT
private:
ColorWidget *col_wgt;
QSpinBox *spin_size_item; // Устанавливает размер элемента
QSpinBox *spin_column_count; // Устанавливает число клонок
QLabel *lbl_color_RGB; // Отображает параметры выбранного цвета
public:
Widget(QWidget *parent = 0);
~Widget();
private slots:
void slotAddItem();
void slotColor(QColor col);
};
#endif // WIDGET_H
#include "widget.h"
#include <QColorDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("Test ColorWidget");
col_wgt = new ColorWidget;
// Кнопка для добавления элемента
QPushButton *btn_add_item = new QPushButton("Add Item");
spin_column_count = new QSpinBox;
spin_column_count->setValue(col_wgt->columnCount());
spin_size_item = new QSpinBox;
spin_size_item->setValue(col_wgt->sizeItem());
lbl_color_RGB = new QLabel("R:, G:, B");
connect(btn_add_item, SIGNAL(clicked()), SLOT(slotAddItem()));
connect(spin_column_count, SIGNAL(valueChanged(int)),
col_wgt, SLOT(setColumnCount(int)));
connect(spin_size_item, SIGNAL(valueChanged(int)),
col_wgt, SLOT(setSizeItem(int)));
connect(col_wgt, SIGNAL(changedColor(QColor)), SLOT(slotColor(QColor)));
QVBoxLayout *vb = new QVBoxLayout;
vb->addWidget(btn_add_item);
vb->addStretch();
vb->addWidget(new QLabel("Column count"));
vb->addWidget(spin_column_count);
vb->addStretch();
vb->addWidget(new QLabel("Size Item"));
vb->addWidget(spin_size_item);
vb->addStretch();
vb->addWidget(new QLabel("Color"));
vb->addWidget(lbl_color_RGB);
QHBoxLayout *hb = new QHBoxLayout;
hb->addLayout(vb);
hb->addWidget(col_wgt);
setLayout(hb);
}
Widget::~Widget()
{
}
void Widget::slotAddItem()
{
QColor col = QColorDialog::getColor();
if(!col.isValid())
return;
col_wgt->addItem(col);
update();
}
void Widget::slotColor(QColor col)
{
QString str = "R:" + QString::number(col.red()) + ", "
"G:" + QString::number(col.green()) + ", B:" + QString::number(col.blue());
lbl_color_RGB->setText(str);
}
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)


