QCustomPlot 坐标轴间隔显示刻度标签

 1.        可直接使用,使用场景:画散点图时,需要显示多个点,但是横坐标标签全部显示的话,就会拥挤,故事用这个方法

//设置坐标
        QVector<QString>xLable;
        QVector<double>xpos;
        int num = 10;
        xLable.resize(num);
        xpos.resize(num);
        int xmin = m_freValue_list.time_t_vector.first();
        int xmax = m_freValue_list.time_t_vector.last();
        double xspan = (xmax+1 - xmin)/num;
        for(int i=0;i<num;i++)
        {
            xpos.append(xmin+i*xspan);
            xLable.append(QString::number(xmin+i*xspan));
        }
        QSharedPointer<QCPAxisTickerText> xaixsTicker = QSharedPointer<QCPAxisTickerText>(new QCPAxisTickerText);

        xaixsTicker->addTicks(xpos,xLable);
        ui->widget_freqStatisticsPlot->xAxis->setTicker(xaixsTicker);

        ui->widget_freqStatisticsPlot->xAxis->setRange(m_FreScatterNum-MAX_POINT_NUM+1,m_FreScatterNum+1);

        ui->widget_freqStatisticsPlot->replot();

2.需要将横坐标贴上标签

//设置坐标
        QVector<QString>xLable;
        QVector<double>xpos;
        int num = 10;
        xLable.resize(num);
        int xmin = 0;
        int xmax = 4096;//频域图绘制4096个点
        double xspan = (xmax+1 - xmin)/num;
        xpos.resize(num);
        for(int i=0;i<num;i++)
        {
            xpos.append(xmin+i*xspan);
            xLable.append(QString::number((xmin+i*xspan)/210.0,'f',1));
        }
        QSharedPointer<QCPAxisTickerText> xaixsTicker = QSharedPointer<QCPAxisTickerText>(new QCPAxisTickerText);

        xaixsTicker->addTicks(xpos,xLable);
        ui->FreqPlot->xAxis->setTicker(xaixsTicker);
        ui->FreqPlot->xAxis->setRange(0,4096);
        ui->FreqPlot->replot();

注意:此方法在支持缩放的图形中,会出现问题,需要配合,在 槽函数中

connect(ui->FreqPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(slot_XaxisRangeChanged(QCPRange)),Qt::UniqueConnection);
   
void QCustomFrequencyPlot::slot_XaxisRangeChanged(QCPRange newRange)
{
    double tickLen = newRange.size()/m_nXTickerCnt;//刻度标签间距
    m_pXaxisTicker->clear();
    QVector<double> ticks;//标签位置
    QVector<QString> labels;//标签显示的值
    for(int i=0; i<=m_nXTickerCnt; i++)
    {
        ticks.push_back(newRange.lower + i*tickLen);

        if(m_stInitSet.stX.strUnit == "")//X轴单位标签为空,则坐标轴都加上标签刻度
        {
           labels.push_back(QString::number(newRange.lower + i*tickLen,'f',0));
           //labels.push_back(QString("%1").arg(newRange.lower + i*tickLen));
        }
        else //如果X轴单位标签不为空,X轴最右边的标签位置不设,留着作为单位标签显示
        {
            if(i != m_nXTickerCnt)
            {
                labels.push_back(QString::number(newRange.lower + i*tickLen,'f',0));
                
            }
            else
            {
                labels.push_back(m_stInitSet.stX.strUnit);
            }
        }
    }
    m_pXaxisTicker->addTicks(ticks, labels);//更新刻度标签
}


版权声明:本文为sinat_20962951原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。