Пример #1
0
void Reportes::inicializarGraficoAngulos()
{
    graficoAngulos->plotLayout()->clear();
    graficoAngulos->clearItems();
    graficoAngulos->clearGraphs();

    //Elementos del grafico
    QCPAxisRect *topAxisRect = new QCPAxisRect(graficoAngulos);
    QCPAxisRect *bottomAxisRect = new QCPAxisRect(graficoAngulos);

    bottomAxisRect->axis(QCPAxis::atLeft)->setRange(0,2);
    bottomAxisRect->axis(QCPAxis::atBottom)->setRange(0,2);

    QCPPlotTitle *tituloX=new QCPPlotTitle(graficoAngulos,"Grafico Angulo Medio-Lateral vs Tiempo");
    QCPPlotTitle *tituloY=new QCPPlotTitle(graficoAngulos,"Grafico Angulo Antero-Posterior vs Tiempo");

    //Se posicionan los layouts
    graficoAngulos->plotLayout()->addElement(0, 0, tituloX);
    graficoAngulos->plotLayout()->addElement(1, 0, topAxisRect);

    graficoAngulos->plotLayout()->addElement(2, 0, tituloY);
    graficoAngulos->plotLayout()->addElement(3, 0, bottomAxisRect);

     //create and configure plottables:
    graficoAnguloX = graficoAngulos->addGraph(topAxisRect->axis(QCPAxis::atBottom), topAxisRect->axis(QCPAxis::atLeft));
    graficoAnguloY = graficoAngulos->addGraph(bottomAxisRect->axis(QCPAxis::atBottom), bottomAxisRect->axis(QCPAxis::atLeft));

    lineaIzqAnguloX=new QCPItemLine(graficoAngulos);
    agregarQCPItemLine(lineaIzqAnguloX,graficoAngulos,topAxisRect);

    lineaDerAnguloX=new QCPItemLine(graficoAngulos);
    agregarQCPItemLine(lineaDerAnguloX,graficoAngulos,topAxisRect);

    lineaIzqAnguloY=new QCPItemLine(graficoAngulos);
    agregarQCPItemLine(lineaIzqAnguloY,graficoAngulos,bottomAxisRect);

    lineaDerAnguloY=new QCPItemLine(graficoAngulos);
    agregarQCPItemLine(lineaDerAnguloY,graficoAngulos,bottomAxisRect);

    //Colores de la Linea
    graficoAnguloX->setPen(QPen(QColor(71, 71, 194), 2));
    graficoAnguloY->setPen(QPen(QColor(153, 102, 51), 2));

    //Labels de los ejes
    topAxisRect->axis(QCPAxis::atLeft)->setLabel("Angulo (grados)");
    topAxisRect->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");
    bottomAxisRect->axis(QCPAxis::atLeft)->setLabel("Angulo (grados)");
    bottomAxisRect->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    //Se rescalan los ejes para el autoajuste
    graficoAnguloX->rescaleAxes();
    graficoAnguloY->rescaleAxes();

    graficoAngulos->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);
}
DrawFinancialChart::DrawFinancialChart(QWidget *parent) :
    QCustomPlot(parent)
{
    resize(600,400);

    legend->setVisible(true);

    // generate two sets of random walk data (one for candlestick and one for ohlc chart):
    int n = 500;
    QVector<double> time(n), value1(n), value2(n);
    QDateTime start = QDateTime(QDate(2014, 6, 11));
    start.setTimeSpec(Qt::UTC);
    double startTime = start.toTime_t();
    double binSize = 3600*24; // bin data in 1 day intervals
    time[0] = startTime;
    value1[0] = 60;
    value2[0] = 20;
    qsrand(9);
    for (int i=1; i<n; ++i)
    {
      time[i] = startTime + 3600*i;
      value1[i] = value1[i-1] + (qrand()/(double)RAND_MAX-0.5)*10;
      value2[i] = value2[i-1] + (qrand()/(double)RAND_MAX-0.5)*3;
    }

    // create candlestick chart:
    QCPFinancial *candlesticks = new QCPFinancial(xAxis, yAxis);
    addPlottable(candlesticks);
    QCPFinancialDataMap data1 = QCPFinancial::timeSeriesToOhlc(time, value1, binSize, startTime);
    candlesticks->setName("Candlestick");
    candlesticks->setChartStyle(QCPFinancial::csCandlestick);
    candlesticks->setData(&data1, true);
    candlesticks->setWidth(binSize*0.9);
    candlesticks->setTwoColored(true);
    candlesticks->setBrushPositive(QColor(245, 245, 245));
    candlesticks->setBrushNegative(QColor(0, 0, 0));
    candlesticks->setPenPositive(QPen(QColor(0, 0, 0)));
    candlesticks->setPenNegative(QPen(QColor(0, 0, 0)));

    // create ohlc chart:
    QCPFinancial *ohlc = new QCPFinancial(xAxis, yAxis);
    addPlottable(ohlc);
    QCPFinancialDataMap data2 = QCPFinancial::timeSeriesToOhlc(time, value2, binSize/3.0, startTime); // divide binSize by 3 just to make the ohlc bars a bit denser
    ohlc->setName("OHLC");
    ohlc->setChartStyle(QCPFinancial::csOhlc);
    ohlc->setData(&data2, true);
    ohlc->setWidth(binSize*0.2);
    ohlc->setTwoColored(true);

    // create bottom axis rect for volume bar chart:
    QCPAxisRect *volumeAxisRect = new QCPAxisRect(this);
    plotLayout()->addElement(1, 0, volumeAxisRect);
    volumeAxisRect->setMaximumSize(QSize(QWIDGETSIZE_MAX, 100));
    volumeAxisRect->axis(QCPAxis::atBottom)->setLayer("axes");
    volumeAxisRect->axis(QCPAxis::atBottom)->grid()->setLayer("grid");
    // bring bottom and main axis rect closer together:
    plotLayout()->setRowSpacing(0);
    volumeAxisRect->setAutoMargins(QCP::msLeft|QCP::msRight|QCP::msBottom);
    volumeAxisRect->setMargins(QMargins(0, 0, 0, 0));
    // create two bar plottables, for positive (green) and negative (red) volume bars:
    QCPBars *volumePos = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));
    QCPBars *volumeNeg = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));
    for (int i=0; i<n/5; ++i)
    {
      int v = qrand()%20000+qrand()%20000+qrand()%20000-10000*3;
      (v < 0 ? volumeNeg : volumePos)->addData(startTime+3600*5.0*i, qAbs(v)); // add data to either volumeNeg or volumePos, depending on sign of v
    }
    setAutoAddPlottableToLegend(false);
    addPlottable(volumePos);
    addPlottable(volumeNeg);
    volumePos->setWidth(3600*4);
    volumePos->setPen(Qt::NoPen);
    volumePos->setBrush(QColor(100, 180, 110));
    volumeNeg->setWidth(3600*4);
    volumeNeg->setPen(Qt::NoPen);
    volumeNeg->setBrush(QColor(180, 90, 90));

    // interconnect x axis ranges of main and bottom axis rects:
    connect(xAxis, SIGNAL(rangeChanged(QCPRange)), volumeAxisRect->axis(QCPAxis::atBottom), SLOT(setRange(QCPRange)));
    connect(volumeAxisRect->axis(QCPAxis::atBottom), SIGNAL(rangeChanged(QCPRange)), xAxis, SLOT(setRange(QCPRange)));
    // configure axes of both main and bottom axis rect:
    volumeAxisRect->axis(QCPAxis::atBottom)->setAutoTickStep(false);
    volumeAxisRect->axis(QCPAxis::atBottom)->setTickStep(3600*24*4); // 4 day tickstep
    volumeAxisRect->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime);
    volumeAxisRect->axis(QCPAxis::atBottom)->setDateTimeSpec(Qt::UTC);
    volumeAxisRect->axis(QCPAxis::atBottom)->setDateTimeFormat("dd. MMM");
    volumeAxisRect->axis(QCPAxis::atBottom)->setTickLabelRotation(15);
    volumeAxisRect->axis(QCPAxis::atLeft)->setAutoTickCount(3);
    xAxis->setBasePen(Qt::NoPen);
    xAxis->setTickLabels(false);
    xAxis->setTicks(false); // only want vertical grid in main axis rect, so hide xAxis backbone, ticks, and labels
    xAxis->setAutoTickStep(false);
    xAxis->setTickStep(3600*24*4); // 4 day tickstep
    rescaleAxes();
    xAxis->scaleRange(1.025, xAxis->range().center());
    yAxis->scaleRange(1.1, yAxis->range().center());

    // make axis rects' left side line up:
    QCPMarginGroup *group = new QCPMarginGroup(this);
    axisRect()->setMarginGroup(QCP::msLeft|QCP::msRight, group);
    volumeAxisRect->setMarginGroup(QCP::msLeft|QCP::msRight, group);
}
Пример #3
0
void Reportes::inicializarGraficoMuestras()
{
    graficoMuestras->plotLayout()->clear(); // let's start from scratch and remove the default axis rect
    graficoMuestras->clearItems();
    graficoMuestras->clearGraphs();

    //Se crean los LAYOUTS principales
    QCPLayoutGrid *layoutAcelerometro = new QCPLayoutGrid;
    QCPLayoutGrid *layoutGiroscopio = new QCPLayoutGrid;

    //Se crean los titulos
    QCPPlotTitle *tituloAcelerometro = new QCPPlotTitle(graficoMuestras, "Gráficos Aceleración X Y Z vs Tiempo");
    QCPPlotTitle *tituloGiroscopio = new QCPPlotTitle(graficoMuestras, "Gráficos Velocidad Angular X Y Z vs Tiempo");

    //Se añaden los layouts principales y los titulos
    graficoMuestras->plotLayout()->addElement(0, 0, tituloAcelerometro);
    graficoMuestras->plotLayout()->addElement(1, 0, layoutAcelerometro);
    graficoMuestras->plotLayout()->addElement(2, 0, tituloGiroscopio);
    graficoMuestras->plotLayout()->addElement(3, 0, layoutGiroscopio);

    // Se crean los sublayouts del acelerometro
    QCPAxisRect *leftAxisRectAcelerometro = new QCPAxisRect(graficoMuestras);
    QCPAxisRect *centerAxisRectAcelerometro = new QCPAxisRect(graficoMuestras);
    QCPAxisRect *rightAxisRectAcelerometro = new QCPAxisRect(graficoMuestras);


    //Se agregan al layout principal
    layoutAcelerometro->addElement(0, 0, leftAxisRectAcelerometro);
    layoutAcelerometro->addElement(0, 1, centerAxisRectAcelerometro);
    layoutAcelerometro->addElement(0, 2, rightAxisRectAcelerometro);

    //Se crean los sublayouts del giroscopio
    QCPAxisRect *leftAxisRectGiroscopio = new QCPAxisRect(graficoMuestras);
    QCPAxisRect *centerAxisRectGiroscopio = new QCPAxisRect(graficoMuestras);
    QCPAxisRect *rightAxisRectGiroscopio = new QCPAxisRect(graficoMuestras);

    //Se agregan al layout principal
    layoutGiroscopio->addElement(0, 0, leftAxisRectGiroscopio);
    layoutGiroscopio->addElement(0, 1, centerAxisRectGiroscopio);
    layoutGiroscopio->addElement(0, 2, rightAxisRectGiroscopio);

    // create and configure plottables: Acelerometro
    graficoAcX = graficoMuestras->addGraph(leftAxisRectAcelerometro->axis(QCPAxis::atBottom), leftAxisRectAcelerometro->axis(QCPAxis::atLeft));
    graficoAcY = graficoMuestras->addGraph(centerAxisRectAcelerometro->axis(QCPAxis::atBottom), centerAxisRectAcelerometro->axis(QCPAxis::atLeft));
    graficoAcZ = graficoMuestras->addGraph(rightAxisRectAcelerometro->axis(QCPAxis::atBottom), rightAxisRectAcelerometro->axis(QCPAxis::atLeft));

    // create and configure plottables: Giroscopio
    graficoGyX = graficoMuestras->addGraph(leftAxisRectGiroscopio->axis(QCPAxis::atBottom), leftAxisRectGiroscopio->axis(QCPAxis::atLeft));
    graficoGyY = graficoMuestras->addGraph(centerAxisRectGiroscopio->axis(QCPAxis::atBottom), centerAxisRectGiroscopio->axis(QCPAxis::atLeft));
    graficoGyZ = graficoMuestras->addGraph(rightAxisRectGiroscopio->axis(QCPAxis::atBottom), rightAxisRectGiroscopio->axis(QCPAxis::atLeft));

    // Lineas para el analisis
    lineaIzqAcX=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaIzqAcX,graficoMuestras,leftAxisRectAcelerometro);
    lineaDerAcX=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaDerAcX,graficoMuestras,leftAxisRectAcelerometro);
    lineaIzqAcY=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaIzqAcY,graficoMuestras,centerAxisRectAcelerometro);
    lineaDerAcY=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaDerAcY,graficoMuestras,centerAxisRectAcelerometro);
    lineaIzqAcZ=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaIzqAcZ,graficoMuestras,rightAxisRectAcelerometro);
    lineaDerAcZ=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaDerAcZ,graficoMuestras,rightAxisRectAcelerometro);

    lineaIzqGyX=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaIzqGyX,graficoMuestras,leftAxisRectGiroscopio);
    lineaDerGyX=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaDerGyX,graficoMuestras,leftAxisRectGiroscopio);
    lineaIzqGyY=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaIzqGyY,graficoMuestras,centerAxisRectGiroscopio);
    lineaDerGyY=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaDerGyY,graficoMuestras,centerAxisRectGiroscopio);
    lineaIzqGyZ=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaIzqGyZ,graficoMuestras,rightAxisRectGiroscopio);
    lineaDerGyZ=new QCPItemLine(graficoMuestras);
    agregarQCPItemLine(lineaDerGyZ,graficoMuestras,rightAxisRectGiroscopio);

    //Estilo del lapiz para la linea
    graficoAcX->setPen(QPen(Qt::blue));
    graficoAcY->setPen(QPen(Qt::blue));
    graficoAcZ->setPen(QPen(Qt::blue));

    graficoGyX->setPen(QPen(QColor(153, 102, 51), 2));
    graficoGyY->setPen(QPen(QColor(153, 102, 51), 2));
    graficoGyZ->setPen(QPen(QColor(153, 102, 51), 2));

    //Labels de los ejes: Acelerometro
    leftAxisRectAcelerometro->axis(QCPAxis::atLeft)->setLabel("Aceleracion Eje X (G)");
    leftAxisRectAcelerometro->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    centerAxisRectAcelerometro->axis(QCPAxis::atLeft)->setLabel("Aceleracion Eje Y (G)");
    centerAxisRectAcelerometro->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    rightAxisRectAcelerometro->axis(QCPAxis::atLeft)->setLabel("Aceleracion Eje Z (G)");
    rightAxisRectAcelerometro->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    //Labels de los ejes: Giroscopio
    leftAxisRectGiroscopio->axis(QCPAxis::atLeft)->setLabel("Velocidad Angular Eje X (º/segundos)");
    leftAxisRectGiroscopio->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    centerAxisRectGiroscopio->axis(QCPAxis::atLeft)->setLabel("Velocidad Angular Eje Y (º/segundos)");
    centerAxisRectGiroscopio->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    rightAxisRectGiroscopio->axis(QCPAxis::atLeft)->setLabel("Velocaidad Angular Eje Z (º/segundos)");
    rightAxisRectGiroscopio->axis(QCPAxis::atBottom)->setLabel("Tiempo (segundos)");

    //Agregamos interactividad
    graficoMuestras->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);
    //grafico->replot(); //Se redibuja para actualizar la vista
}
Пример #4
0
void MainWindow::setupItemTracerTest_MyTest_2(QCustomPlot *customPlot)
{
	QCPAxisRect* pAxisRectTop = NULL;
	QCPAxisRect* pAxisRectBottom = NULL;
	QCPLayoutGrid *pLayoutGrid = NULL;
	QCPMarginGroup *pMarginGroup = NULL;
	QCPItemTracerCrossHair *pTracerTop = NULL;
	QCPItemTracerCrossHair *pTracerBottom = NULL;
	CMidSubDrawHelper* m_pMidSubDrawHelper = NULL;
	CHistoryDataManager* pHistoryDataManager = NULL;

	customPlot->clearGraphs();
	customPlot->plotLayout()->clear(); // clear default axis rect so we can start from scratch

	pAxisRectTop = new QCPAxisRect(customPlot);
	pAxisRectTop->setupFullAxesBox(true);
	pAxisRectTop->axis(QCPAxis::atLeft)->setLabel(QObject::tr("Y-value"));
	pAxisRectTop->axis(QCPAxis::atBottom)->setLabel(QObject::tr("X-time"));
	pAxisRectTop->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime);
	pAxisRectTop->axis(QCPAxis::atBottom)->setDateTimeFormat(DEF_STRING_FORMAT_TIME.c_str());

	pAxisRectBottom = new QCPAxisRect(customPlot);
	pAxisRectBottom->setupFullAxesBox(true);
	pAxisRectBottom->axis(QCPAxis::atLeft)->setLabel(QObject::tr("Y-value"));
	pAxisRectBottom->axis(QCPAxis::atBottom)->setLabel(QObject::tr("X-time"));
	pAxisRectBottom->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime);
	pAxisRectBottom->axis(QCPAxis::atBottom)->setDateTimeFormat(DEF_STRING_FORMAT_TIME.c_str());//("yyyy-MM-dd hh-mm-ss");

	customPlot->plotLayout()->addElement(0, 0, pAxisRectTop); // insert axis rect in first row
	customPlot->plotLayout()->addElement(1, 0, pAxisRectBottom); // insert axis rect in first row

	pLayoutGrid = customPlot->plotLayout();
	pMarginGroup = new QCPMarginGroup(customPlot);
	pLayoutGrid->element(0, 0)->setMarginGroup(QCP::msAll, pMarginGroup);
	pLayoutGrid->element(1, 0)->setMarginGroup(QCP::msAll, pMarginGroup);

	m_pMidSubDrawHelper = new CMidSubDrawHelper();
	pHistoryDataManager = new CHistoryDataManager();

	m_pMidSubDrawHelper->drawHistoryBarData(pHistoryDataManager, customPlot, pAxisRectTop);
	m_pMidSubDrawHelper->drawHistoryVolumeData(pHistoryDataManager, customPlot, pAxisRectBottom);

	//setupItemTracerTest_MyTest_addGrap(customPlot, pAxisRectTop);
	//setupItemTracerTest_MyTest_addGrap(customPlot, pAxisRectBottom);


	pTracerTop = NULL;
	pTracerTop = new QCPItemTracerCrossHair(customPlot);
	customPlot->addItem(pTracerTop);
	pTracerTop->setTracerAxisRect(pAxisRectTop);
	pTracerTop->setStyle(QCPItemTracerCrossHair::tsCrosshair);
	pTracerTop->setShowLeft(QCPAxis::ltNumber, true, QString(""));
	pTracerTop->setShowBottom(QCPAxis::ltDateTime, true, QString(DEF_STRING_FORMAT_TIME.c_str()));
	m_pQCPItemTracerCrossHairTop = pTracerTop;

	pTracerBottom = NULL;
	pTracerBottom = new QCPItemTracerCrossHair(customPlot);
	customPlot->addItem(pTracerBottom);
	pTracerBottom->setTracerAxisRect(pAxisRectBottom);
	pTracerBottom->setStyle(QCPItemTracerCrossHair::tsCrosshair);
	pTracerBottom->setShowLeft(QCPAxis::ltNumber, true, QString(""));
	pTracerBottom->setShowBottom(QCPAxis::ltDateTime, true, QString(DEF_STRING_FORMAT_TIME.c_str()));
	m_pQCPItemTracerCrossHairBottom = pTracerBottom;
	connect(customPlot, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(QCPItemTracerCrossHairMouseMove(QMouseEvent*)));


	//customPlot->rescaleAxes();
	customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
	customPlot->replot();//draw again


	if (NULL != m_pMidSubDrawHelper)
	{
		delete m_pMidSubDrawHelper;
		m_pMidSubDrawHelper = NULL;
	}
	
	if (NULL != pHistoryDataManager)
	{
		delete pHistoryDataManager;
		pHistoryDataManager = NULL;
	}


}
Пример #5
0
void MainWindow::setupItemTracerTest_MyTest_1(QCustomPlot *customPlot)
{
	QCPAxisRect* pAxisRectTop = NULL;
	QCPAxisRect* pAxisRectBottom = NULL;
	QCPLayoutGrid *pLayoutGrid = NULL;
	QCPMarginGroup *pMarginGroup = NULL;
	QCPItemTracerCrossHair *pTracerTop = NULL;
	QCPItemTracerCrossHair *pTracerBottom = NULL;

	customPlot->clearGraphs();
	customPlot->plotLayout()->clear(); // clear default axis rect so we can start from scratch

	pAxisRectTop = new QCPAxisRect(customPlot);
	pAxisRectTop->setupFullAxesBox(true);
	//pAxisRectTop->axis(QCPAxis::atLeft)->setLabel(QObject::tr("Y-value"));
	//pAxisRectTop->axis(QCPAxis::atBottom)->setLabel(QObject::tr("X-time"));
	//pAxisRectTop->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime);
	//pAxisRectTop->axis(QCPAxis::atBottom)->setDateTimeFormat("yyyy-MM-dd hh-mm-ss");//DEF_STRING_FORMAT_TIME

	pAxisRectBottom = new QCPAxisRect(customPlot);
	pAxisRectBottom->setupFullAxesBox(true);
	//pAxisRectBottom->axis(QCPAxis::atLeft)->setLabel(QObject::tr("Y-value"));
	//pAxisRectBottom->axis(QCPAxis::atBottom)->setLabel(QObject::tr("X-time"));
	//pAxisRectBottom->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime);
	//pAxisRectBottom->axis(QCPAxis::atBottom)->setDateTimeFormat("yyyy-MM-dd hh-mm-ss");//DEF_STRING_FORMAT_TIME

	customPlot->plotLayout()->addElement(0, 0, pAxisRectTop); // insert axis rect in first row
	customPlot->plotLayout()->addElement(1, 0, pAxisRectBottom); // insert axis rect in first row

	pLayoutGrid = customPlot->plotLayout();
	pMarginGroup = new QCPMarginGroup(customPlot);
	pLayoutGrid->element(0, 0)->setMarginGroup(QCP::msAll, pMarginGroup);
	pLayoutGrid->element(1, 0)->setMarginGroup(QCP::msAll, pMarginGroup);



	QCPGraph *graph = customPlot->addGraph(pAxisRectTop->axis(QCPAxis::atBottom), pAxisRectTop->axis(QCPAxis::atLeft));
	int n = 200;
	QVector<double> x(n), y(n);
	for (int i=0; i<n; ++i)
	{
		x[i] = 0.5+i/(double)n*4;
		y[i] = qSin(x[i])+1.5;
	}
	graph->setData(x, y);


	pTracerTop = NULL;
	pTracerTop = new QCPItemTracerCrossHair(customPlot);
	customPlot->addItem(pTracerTop);
	pTracerTop->setTracerAxisRect(pAxisRectTop);
	pTracerTop->setStyle(QCPItemTracerCrossHair::tsCrosshair);
	m_pQCPItemTracerCrossHairTop = pTracerTop;

	pTracerBottom = NULL;
	pTracerBottom = new QCPItemTracerCrossHair(customPlot);
	customPlot->addItem(pTracerBottom);
	pTracerBottom->setTracerAxisRect(pAxisRectBottom);
	pTracerBottom->setStyle(QCPItemTracerCrossHair::tsCrosshair);
	m_pQCPItemTracerCrossHairBottom = pTracerBottom;
	connect(customPlot, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(QCPItemTracerCrossHairMouseMove(QMouseEvent*)));


	customPlot->rescaleAxes();
	customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
	customPlot->replot();//draw again


}