Russian Qt Forum
Ноябрь 23, 2024, 08:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QChartLibrary  (Прочитано 6570 раз)
alexis031182
Гость
« : Октябрь 12, 2009, 11:18 »

Доброго времени суток!

На форуме не раз возникал вопрос о возможности рисования графиков и диаграмм посредством библиотеки Qt. Некоторое время назад решение данной задачи потребовалось и мне. Ни одно из готовых приложений, доступных к использованию, мне не подошло, поскольку, либо оказалось слишком сложно в освоении (лично для меня это проблема Улыбающийся ), либо не соответствовало конкретной практической задаче. В связи с этим я приступил к разработке собственной библиотеки виджетов. На данный момент "библиотека" - сказано громко, однако лиха беда начало.

Итак, что имеется:

- обычная гистограмма;
- гистограмма с накоплением;
- процентная гистограмма с накоплением.

Каждый из типов гистограммы может быть нарисован как в вертикальной, так и в горизонтальной пространственной ориентации. То есть всего получается шесть типов диаграмм.

Как и положено, поддерживается управление параметрами кисти, пера и шрифта для рисования элементов диаграммы. Доступна выгрузка изображения диаграммы в QPixmap (кстати, этот способ я подсмотрел на этом форуме; спасибо автору Улыбающийся ).

Состав библиотеки:

- QChart: основной родительский класс для всех типов диаграмм;
- QChartHistogram: наследуется от QChart и реализует рисование гистограммы;
- QChartData: класс управления таблицей данных диаграммы;
- QChartDataItem: класс описания элемента диаграммы (столбца);
- QChartDataLabel: класс описания надписи на элементе диаграммы, а также категории элементов.

Пример использования:

Код:
//Создать класс управления таблицей данных.
QChartData *chart_data = new QChartData(this);

//Создать класс описания надписи на элементах диаграммы.
QChartDataLabel *label = new QChartDataLabel(this);

//Установить позицию надписи (другие доступные типы можно посмотреть в файле qchartdatalabel.h)
label->setPosition(QChartDataLabel::CENTER);

//Создать класс описания категории.
QChartDataLabel *category = new QChartDataLabel(this, tr("январь"));

//Создать категорию.
QChartDataItem *item = chart_data->addItem(category, 250);
item->setGraphics(QPen(Qt::black), QBrush(Qt::green));
item->setLabel(label);

//Создать дочерний элемент категории.
QChartDataItem *childitem = item->addChildItem(250);
childitem->setGraphics(QPen(Qt::black), QBrush(Qt::red));
childitem->setLabel(label);

//Ещё один туда же.
childitem = item->addChildItem(90);
childitem->setGraphics(QPen(Qt::black), QBrush(Qt::yellow));
childitem->setLabel(label);

//Создать ещё одну категорию.
category = new QChartDataLabel(this, tr("февраль"));
item = chart_data->addItem(category, 100);
item->setGraphics(QPen(Qt::black), QBrush(Qt::green));
item->setLabel(label);

//... и ещё одну ...
category = new QChartDataLabel(this, tr("март"));
item = chart_data->addItem(category, 400);
item->setGraphics(QPen(Qt::black), QBrush(Qt::green));
item->setLabel(label);

//... и ещё одну ...
category = new QChartDataLabel(this, tr("апрель"));
item = chart_data->addItem(category, 300);
item->setGraphics(QPen(Qt::black), QBrush(Qt::green));
item->setLabel(label);

//... и ещё одну ...
category = new QChartDataLabel(this, tr("май"));
item = chart_data->addItem(category, 50);
item->setGraphics(QPen(Qt::black), QBrush(Qt::green));
item->setLabel(label);

//... и ещё одну ...
category = new QChartDataLabel(this, tr("июнь"));
item = chart_data->addItem(category, 20);
item->setGraphics(QPen(Qt::black), QBrush(Qt::green));
item->setLabel(label);

//Ну и для последней категории тоже понасоздавать дочерних элементов.
childitem = item->addChildItem(250);
childitem->setGraphics(QPen(Qt::black), QBrush(Qt::red));
childitem->setLabel(label);

childitem = item->addChildItem(90);
childitem->setGraphics(QPen(Qt::black), QBrush(Qt::yellow));
childitem->setLabel(label);

//Создать виджет гистограммы.
QChartHistogram *chart = new QChartHistogram(this);

//Так можно переопределить умолчальные параметры типа и пространственной ориентации гистограммы.
//chart->setType(QChartHistogram::PERCENT);
//chart->setOrientation(QChartHistogram::HORIZONTAL);

//Установить данные диаграммы.
chart->setData(chart_data);

//Так можно определить процентное соотношение между столбцами гистограммы.
//chart->setBarInterval(20);

//Установить параметры пера для рисования осей диаграммы.
chart->setPen(QPen(Qt::gray));

//Нарисовать прямоугольник, обрамляющий область рисования диаграммы.
chart->paintSceneRect(QPen(Qt::black));

//Ну и, собственно, рисуем...
chart->paint();

Буду рад, если кому-нибудь данная библиотека будет полезна. Также готов выслушать критику, а также пожелания и предложения по поводу модернизации.

З.Ы. "Легенду" диаграммы внесу в следующей версии.
Записан
nn1317
Гость
« Ответ #1 : Январь 04, 2010, 00:39 »

недавно сильно понадобилась рисовалка свечек для финансовых рынков...)
готово для с++ не нашлось.. тока для с#. пришлось на коленке за 2 часа написать свою... автомасштаб, прокрутка, свечи для фондового рынка формата ohlcv. в принципе ничего сложно, но немало людей с такой же проблемой нехватки подобных рисовалок сталкивались) возможно, это могло бы быть фишкой твоей библиотеки)
Записан
Karl-Philipp
Гость
« Ответ #2 : Январь 04, 2010, 12:02 »

alexis031182, хотелось бы посмотреть как выглядит библиотека с легендой Улыбающийся
Записан
NicK
Гость
« Ответ #3 : Март 09, 2010, 13:55 »

проект еще разрабатывается? где можно посмотреть на актуальную версию?
Записан
alexis031182
Гость
« Ответ #4 : Март 09, 2010, 13:56 »

Уже нет
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 21.