Доброго времени суток!
На форуме не раз возникал вопрос о возможности рисования графиков и диаграмм посредством библиотеки 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();
Буду рад, если кому-нибудь данная библиотека будет полезна. Также готов выслушать критику, а также пожелания и предложения по поводу модернизации.
З.Ы. "Легенду" диаграммы внесу в следующей версии.