Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2016, 05:33   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию Qt виджет выбор цвета

Есть ли в Qt виджет, выбора цвета? Не QColorDialog, а именно виджет, что бы его поместить в основную форму.

Я что то такого не нашел Можно конечно и самому запилить, но не ужели в такой мощной библиотеке его нет.
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.02.2016, 10:57   #2
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Вот запилил, на скорую руку. Виджет выбора цвета помещен в главную форму, с помощью лайаута, с права. Слева, в главном окне, расположены
спин-боксы для изменения числа колонок и размеров элементов. Так же лейбел, для отображения R G B выбранного цвета.
Имеет контекстное меню, для удаления, добавления и редактирования элементов
Изображения
Тип файла: jpg ____________ ____________ ____ 2016-02-24 19_04_16.jpg (47.6 Кб, 158 просмотров)

Последний раз редактировалось SAMOUCHKA; 25.02.2016 в 11:00.
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.02.2016, 11:03   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

вот собственно код виджета выбора цвета:
Код:
#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();
}
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.02.2016, 11:05   #4
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

А вот код главной формы:
Код:
#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);
}
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор цвета в TsColorBox artemavd Компоненты Delphi 5 06.04.2012 05:34
Jquery - выбор цвета Delphinchik JavaScript, Ajax 2 31.07.2011 19:56
Виджет AnKor94 Общие вопросы Delphi 2 18.01.2011 20:23
Выбор цвета Fiesta200 Microsoft Office Word 8 17.07.2010 12:52
Выбор цвета DANIЯR Общие вопросы Delphi 18 11.12.2008 10:34