Introdução ao QCustomPlot: Biblioteca de Gráficos para Qt

Visão Geral

O QCustomPlot é uma biblioteca leve e eficiente para criação de gráficos em aplicações Qt. Esta ferramenta permite adicionar capacidades de visualização de dados a projetos Qt de forma simples, bastando incluir os arquivos de cabeçalho e implementação no projeto.

A biblioteca oferece suporte à exportação de gráficos em diversos formatos, incluindo arquivos PDF vetoriais e imagens rasterizadas como PNG, JPG e BMP, sendo ideal para aplicações que necessitam exibir dados em tempo real ou gerar visualizações de alta qualidade.

Recursos e Capacidades

Tipos de Gráficos Suportados

O QCustomPlot permite criar diversos tipos de visualizações:

  • Gráficos de linha e dispersão
  • Curvas paramétricas
  • Gráficos de barras
  • Box plots estatísticos
  • Mapas de cores 2D
  • Gráficos financeiros (candlestick)
  • Barras de erro

Vantagens de Performance

A arquitetura do QCustomPlot utiliza técnicas de cache e processamento otimizado que permitem renderizar milhões de pontos com筆 largura configurável, mantendo boa performance. Em comparação com outras soluções como QtCharts, que pode apresentar lentidão com mais de dois mil pontos, o QCustomPlot man tm desempenho consistente mesmo com volumes maiores de dados.

Considerações sobre Customização

A estrutura de herança do QCustomPlot permite diversas modificações, embora alterações diretas no código fonte exijam avaliação cuidadosa, pois podem afetar outras funcionalidades. Recomenda-se analisar bem os requisitos antes de modificar a biblioteca.

Obtenção e Instalação

O QCustomPlot está disponível para download através do site oficial. Os arquivos necessários são qcustomplot.h e qcustomplot.cpp, que devem ser adicionados diretamente ao projeto Qt.

A abordagem recomendada de implementação envolve criar um módulo separado com estes arquivos e configurar o projeto para incluí-los adequadamente.

Criação de Gráficos Básicos

Para criar um gráfico, utiliza-se o método addGraph() para adicionar uma nova curva aowidget. Os dados são fornecidos através de vetores contendo as coordenadas x e y, onde x representa a chave (key) e y representa o valor (value).

O QCustomPlot utiliza a terminologia de chaves e valores para permitir maior flexibilidade na definição dos eixos. Por padrão, o widget possui quatro eixos: xAxis e yAxis (eixos inferiores e esquerdo), e xAxis2 e yAxis2 (eixos superiores e direito).

// Criação de dados para o gráfico
QVector<double> dadosX(101), dadosY(101);
for (int i = 0; i < 101; ++i)
{
  dadosX[i] = i / 50.0 - 1;  // intervalo de -1 a 1
  dadosY[i] = dadosX[i] * dadosX[i];  // função quadrática
}

// Adicionar gráfico e atribuir dados
graficoPersonalizado->addGraph();
graficoPersonalizado->graph(0)->setData(dadosX, dadosY);

// Configurar rótulos dos eixos
graficoPersonalizado->xAxis->setLabel("Eixo X");
graficoPersonalizado->yAxis->setLabel("Eixo Y");

// Definir intervalos visíveis
graficoPersonalizado->xAxis->setRange(-1, 1);
graficoPersonalizado->yAxis->setRange(0, 1);
graficoPersonalizado->replot();</double>

Personalização de Eixos

A aparência dos eixos pode ser modificada através de diversos métodos: setBasePen, setTickPen, setTickLength, setSubTickLength, setSubTickPen, setTickLabelFont, setLabelFont, setTickLabelPadding e setLabelPadding.

O QCustomPlot gerencia automaticamente as marcações dos eixos através de instâncias do tipo QCPAxisTicker. É possível ajustar a quantidade aproximada de marcações usando setTickCount().Existen tickers especializados para intervalos de tempo, datas, categorias, valores π e escalas logarítmicas.

Configuração de Linhas de Grade

As linhas de grade podem ser personalizadas através do objeto grid de cada eixo. O método setPen() define o estilo das linhas, enquanto setZeroLinePen() permite configurar uma aparência diferente para a linha em zero. Linhas de subgrade podem ser tornadas visíveis com setSubGridVisible(true).

Estilos de Linhas e Símbolos

Para modificar a aparência de um gráfico:

  • Estilo de linha: setLineStyle()
  • Caneta: setPen() - suporta diferentes cores, larguras e opacidades
  • Símbolos de dispersão: setScatterStyle()
  • Preenchimento: setBrush() - permite cores sólidas, gradientes e texturas

Exemplo: Múltiplos Gráficos com Preenchimento

O exemplo a seguir demonstra como criar múltiplos gráficos com diferentes estilos:

// Adicionar primeiro gráfico
graficoPersonalizado->addGraph();
graficoPersonalizado->graph(0)->setPen(QPen(Qt::blue));
graficoPersonalizado->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 30)));

// Adicionar segundo gráfico
graficoPersonalizado->addGraph();
graficoPersonalizado->graph(1)->setPen(QPen(Qt::red));

// Gerar dados
QVector<double> abscissas(251), ordenadas1(251), ordenadas2(251);
for (int i = 0; i < 251; ++i)
{
  abscissas[i] = i;
  ordenadas1[i] = std::exp(-i / 150.0) * std::cos(i / 10.0);
  ordenadas2[i] = std::exp(-i / 150.0);
}

// Atribuir dados
graficoPersonalizado->graph(0)->setData(abscissas, ordenadas1);
graficoPersonalizado->graph(1)->setData(abscissas, ordenadas2);

// Configurar eixos superiores
graficoPersonalizado->xAxis2->setVisible(true);
graficoPersonalizado->yAxis2->setVisible(true);

// Sincronizar intervalos dos eixos
connect(graficoPersonalizado->xAxis, SIGNAL(rangeChanged(QCPRange)), 
        graficoPersonalizado->xAxis2, SLOT(setRange(QCPRange)));
connect(graficoPersonalizado->yAxis, SIGNAL(rangeChanged(QCPRange)), 
        graficoPersonalizado->yAxis2, SLOT(setRange(QCPRange)));

// Ajustar escalas automaticamente
graficoPersonalizado->graph(0)->rescaleAxes();
graficoPersonalizado->graph(1)->rescaleAxes(true);

// Habilitar interações do usuário
graficoPersonalizado->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);</double>

Preenchimento entre Gráficos

O preenchimento entre dois gráficos é ativado através do método setChannelFillGraph(). Passando nullptr ou 0.remove-se o preenchimento entre canais.

Trabalhando com Datas e Horários

Para gráficos envolvendo datas, utiliza-se QCPAxisTickerDateTime:

// Configurar local para nomes em inglês
graficoPersonalizado->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom));

// Obter tempo atual como ponto de partida
double tempoAtual = QDateTime::currentDateTime().toTime_t();

// Criar múltiplos gráficos com dados temporais
for (int g = 0; g < 5; ++g)
{
  graficoPersonalizado->addGraph();
  QColor cor(20 + 200.0/4 * g, 70 * (1.6 - g/4.0), 150, 150);
  
  graficoPersonalizado->graph()->setLineStyle(QCPGraph::lsLine);
  graficoPersonalizado->graph()->setPen(QPen(cor.lighter(200)));
  graficoPersonalizado->graph()->setBrush(QBrush(cor));
  
  // Gerar dados de caminhada aleatória
  QVector<QCPGraphData> dadosTemporais(250);
  for (int i = 0; i < 250; ++i)
  {
    dadosTemporais[i].key = tempoAtual + 24 * 3600 * i;
    if (i == 0)
      dadosTemporais[i].value = (i/50.0 + 1) * (rand() / (double)RAND_MAX - 0.5);
    else
      dadosTemporais[i].value = std::fabs(dadosTemporais[i-1].value) * 
                                 (1 + 0.02/4.0 * (4 - g)) + 
                                 (i/50.0 + 1) * (rand() / (double)RAND_MAX - 0.5);
  }
  graficoPersonalizado->graph()->data()->set(dadosTemporais);
}

// Configurar eixo temporal
QSharedPointer<QCPAxisTickerDateTime> tickerData(new QCPAxisTickerDateTime);
tickerData->setDateTimeFormat("d. MMMM\nyyyy");
graficoPersonalizado->xAxis->setTicker(tickerData);

// Configurar intervalo
graficoPersonalizado->xAxis->setRange(tempoAtual, tempoAtual + 24 * 3600 * 249);
graficoPersonalizado->yAxis->setRange(0, 60);

Todas as coordenadas de data/hora no QCustomPlot são tratadas em segundos desde epoch Unix (1 de janeiro de 1970). Para precisões inferiores a um segundo, o sistema utiliza valores de ponto flutuante onde valores menores que 1.0 representam frações de segundo.

Outros Tipos de Gráficos

Além de gráficos de linha (QCPGraph), o QCustomPlot oferece outras classes de plotagem:

  • QCPCurve: curvas paramétricas que podem apresentar loops
  • QCPBars: gráficos de barras, com suporte a barras堆叠
  • QCPStatisticalBox: box plots com representação de quartis e outliers
  • QCPColorMap: visualização 2D com mapa de cores
  • QCPFinancial: gráficos de candlestick ou OHLC para preços de ações
  • QCPErrorBars: barras de erro associadas a outros gráficos

A interface genérica para todas as classes de plotagem é baseada na classe abstrata QCPAbstractPlottable.

Exemplo: Gráfico de Barras

// Criar barras associando aos eixos
QCPBars *barras = new QCPBars(graficoPersonalizado->xAxis, graficoPersonalizado->yAxis);
barras->setName("Série de Barras 1");

QVector<double> chavesBarras;
QVector<double> valoresBarras;
chavesBarras << 1 << 2 << 3;
valoresBarras << 2 << 4 << 8;

barras->setData(chavesBarras, valoresBarras);
graficoPersonalizado->rescaleAxes();
graficoPersonalizado->replot();

É possível estender o QCustomPlot criando classes personalizadas herdadas de QCPAbstractPlottable para atender requisitos específicos de visualização.

Tags: Qt C++ qcustomplot gráficos Visualização de Dados

Publicado em 7-22 00:41