QCustomPlot(2)-QCPGraph

枚举

enum QCPGraph::LineStyle

  1. lsNone:
    数据点之间不通过任何线连接。
    例如,数据仅通过散点样式表示,可以使用setScatterStyle来设置。
  2. lsLine:
    数据点通过直线连接。
    这是绘制普通连续曲线的常用方式。
  3. lsStepLeft:
    线以步进的方式绘制,其中步进的高度是左侧数据点的值。
    当你想表示阶梯函数时,这可以很有用。
  4. lsStepRight:
    线以步进的方式绘制,其中步进的高度是右侧数据点的值。
  5. lsStepCenter:
    线以步进的方式绘制,其中步进位于两个数据点之间的中心位置。
  6. lsImpulse:
    每个数据点都由一条与值轴平行的线表示,该线从数据点延伸到零值线。
    当你想要表示脉冲或突发事件时,这个样式很有用。

1 函数

1.1 data

QSharedPointer< QCPGraphDataContainer > QCPGraph::data ( ) const
QCPGraphDataContainer是一个专门为QCPGraph存储其数据点的容器。

该容器包含的数据点是QCPGraphData类型的。每一个QCPGraphData都有一个x和y值,这代表图表上的一个点。

返回这种共享指针的好处是:

  1. 可以直接访问和修改数据,无需多余的数据复制。
  2. 使用共享指针管理内存,确保数据的生命周期得到合理管理。

例如,如果为一个图表添加一个新的数据点,而不想重新设置整个数据集,可以这样做:

QSharedPointer<QCPGraphDataContainer> graphData = ui->widget->graph(0)->data();
graphData->add(QCPGraphData(xValue, yValue));

请注意,对数据进行直接操作后,可能需要调用replot()函数来确保图表更新并反映新的数据点。

要在容器中遍历数据点,可以使用QCPGraphDataContainer的迭代器。例如,为了计算y值的平均值,可以这样做:

QSharedPointer<QCPGraphDataContainer> graphData = ui->widget->graph(0)->data();
double sum = 0;
int count = 0;
for (auto it = graphData->begin(); it != graphData->end(); ++it) {
    sum += it->value;
    count++;
}
double average = count != 0 ? sum / count : 0;

1.2 setData

void QCPGraph::setData ( QSharedPointer< QCPGraphDataContainer > data)

利用QSharedPointer,QCustomPlot允许多个图形(graphs)共享相同的数据容器。这在你有多个图形显示相同的数据时非常有用,尤其是当你想以不同的方式展示它们,或当你想在不多次复制数据的情况下传递相同的数据,特别是对于大数据集。

要使用此功能:

  1. 首先需要创建一个共享的数据容器。
  2. 然后将此共享的数据容器设置给任意数量的图形。

下面是一个简单的例子来展示这个功能:

QSharedPointer<QCPGraphDataContainer> sharedData = QSharedPointer<QCPGraphDataContainer>(new QCPGraphDataContainer);

// 向sharedData中添加一些数据,例如:
for (double i = 0; i < 10; i += 0.1) {
    sharedData->add(QCPGraphData(i, qSin(i)));
}

QCPGraph *graph1 = customPlot->addGraph();
graph1->setData(sharedData);

QCPGraph *graph2 = customPlot->addGraph();
graph2->setData(sharedData);

// 如果需要,你可以为这两个图形设置不同的样式,例如:
graph1->setPen(QPen(Qt::blue));
graph2->setPen(QPen(Qt::red, 2, Qt::DotLine));

customPlot->rescaleAxes();
customPlot->replot();

在这个例子中,graph1 和 graph2 共享相同的数据,但它们的显示方式不同(一个是蓝色的线,另一个是红色的点线)。

注意:

 graph2->data()->set(*graph1->data()); // graph2 now has copy of graph1's data in its container

graph2现在有了graph1数据的一个完整的独立副本。这意味着,即使稍后修改graph1的数据,graph2的数据也不会受到影响,反之亦然。

这种方式与前面提到的使用QSharedPointer共享数据不同。在这种情况下,两个图形确实有完全独立的数据。

2.3 setData

void QCPGraph::setData ( const QVector< double > & keys, const QVector< double > & values, bool alreadySorted = false )

直接使用两个QVector向量来设置图形的数据,其中一个向量表示x轴的键(通常是时间或其他连续的度量),另一个向量表示y轴的值。

此函数会替换当前图形的所有数据,所以调用它后,图形只包含传递给此函数的数据点。

QVector<double> xData = {1.0, 2.0, 3.0, 4.0, 5.0};
QVector<double> yData = {5.0, 3.0, 2.0, 4.0, 1.0};

graph->setData(xData, yData);

参数alreadySorted是一个布尔值,默认为false。如果你已经确保提供的x值(即keys)是按升序排序的,那么你可以将这个参数设置为true,这样QCustomPlot在处理数据时就不会再进行排序,从而提高性能。但如果你不确定数据是否已排序,最好保持默认值,以确保数据在绘图时正确显示。

此函数非常适合从外部数据源(如文件、数据库或网络请求)读取数据,并快速地在图形中显示它。

2.4 setLineStyle

LineStyle lineStyle () const
获取线的样式
void QCPGraph::setLineStyle ( LineStyle ls)
设置线的样式

2.5 setScatterStyle

setScatterStyle是一个函数,用于设置QCPGraph的散点样式。QCPScatterStyle定义了图中单个数据点的视觉表现。这在某些图形中很重要,尤其是当你不仅想显示通过线连接的数据点,而且还想强调单个数据点时。

以下是QCPScatterStyle的一些常用选项:

  • ssNone: 不绘制任何散点。
  • ssDot: 一个像素点。如果想要有确定半径的圆形,使用ssDisc或ssCircle。
  • ssCross: 交叉形状。
  • ssPlus: 加号形状。
  • ssCircle: 空心圆。
  • ssDisc: 实心圆。
  • ssSquare: 空心正方形。
  • ssDiamond: 菱形。
  • ssStar: 八边形星星,是交叉和加号的结合。
  • ssTriangle: 立在基线上的等边三角形。
  • ssTriangleInverted: 立在角上的等边三角形。
  • ssCrossSquare: 里面有交叉的正方形。
  • ssPlusSquare: 里面有加号的正方形。
  • ssCrossCircle: 里面有交叉的圆形。
  • ssPlusCircle: 里面有加号的圆形。
  • ssPeace: 一个圆,里面有一个垂直线和两个向下的对角线。
  • ssPixmap: 使用setPixmap设置的自定义像素图,以数据点坐标为中心。
  • ssCustom: 执行自定义的绘图操作,如QPainterPath(通过setCustomPath设置)。

使用方法如下:

QCPScatterStyle scatterStyle;
scatterStyle.setShape(QCPScatterStyle::ssCircle);
scatterStyle.setSize(6);  // 设置散点的大小
graph->setScatterStyle(scatterStyle);

这样,图形上的每个数据点都将以圆圈的形式显示,大小为6像素。

2.6 setScatterSkip

void QCPGraph::setScatterSkip ( int skip)
该方法允许你控制散点图中绘制的点的稀疏程度,即它可以让你选择跳过和不绘制某些点,从而使数据看起来更为稀疏。这在数据点非常密集的情况下特别有用,因为它可以提高绘图的性能,并防止散点覆盖整个图形,从而使图形难以阅读。

函数的参数是int skip。当skip设置为0(默认值)时,所有散点都将被绘制。当你将其设置为1时,每绘制一个点后都会跳过一个点。如果设置为2,那么每绘制一个点后都会跳过两个点,依此类推。

例如,假设你有一个数据系列,其中包含这些点:A, B, C, D, E, F, G, H

如果skip设置为0,则所有点都将绘制,得到:A, B, C, D, E, F, G, H
如果skip设置为1,则将绘制一半的点,得到:A, C, E, G
如果skip设置为2,则将绘制更少的点,得到:A, D, G
以此类推
这个功能在你希望保持连续的线条,但希望散点图不那么密集时特别有用。

2.7 setAdaptiveSampling

void QCPGraph::setAdaptiveSampling ( bool enabled)

setAdaptiveSampling 是 QCustomPlot 中一个优化性能的功能。当你有一个包含大量数据点的图形时(例如超过10,000个点),渲染这些点可能会很慢,尤其是当你尝试重绘或缩放图形时。这是因为绘制大量的数据点会消耗大量的计算资源。

为了解决这个问题,QCustomPlot 引入了一个称为“自适应采样”的技术。简单来说,当自适应采样被启用时,QCustomPlot 不会绘制所有的数据点。相反,它会智能地选择并绘制一部分数据点,这些点在视觉上近似于原始的所有点。这大大减少了需要绘制的数据点的数量,从而提高了绘图的性能。

例如,考虑一个图形中有很多相邻的数据点,它们的y值都非常接近或相同。在大多数情况下,没有必要绘制所有这些点,因为在视觉上它们几乎是重叠的。通过仅绘制其中的一部分,您仍然可以获得与原始图形非常接近的外观,同时大大提高绘图速度。

以下是此功能的一些要点:

  • 默认启用:在默认情况下,自适应采样是启用的。
  • 智能决策:即使您启用了自适应采样,QCustomPlot 仍然会为每个图形智能地决定是否真的使用它。因此,通常建议始终启用它
  • 主要用于大数据集:对于少量的数据点,自适应采样可能不会带来明显的性能提升,但对于大量的数据点,它可能会非常有用。

2.8 addData

void QCPGraph::addData ( const QVector< double > & keys, const QVector< double > & values, bool alreadySorted = false )

参数:

  • keys: 这是一个 QVector,代表将要添加的数据点的 x 值。
  • values: 同样是一个 QVector,代表将要添加的数据点的 y 值。
  • alreadySorted (可选): 是一个布尔值,默认为 false。如果您确保传入的数据点已经按照 x 值升序排序,那么您可以将其设置为 true,以提高性能,因为它会避免内部的排序操作。

功能:

  • 该函数将 keys 和 values 中提供的数据点添加到图形的现有数据中。
  • 提供的 keys 和 values 向量应具有相同的长度。如果它们的长度不相同,那么添加的数据点的数量将是两个向量中较小的那个的大小。
  • 如果您已经知道数据是排序的,那么通过设置 alreadySorted 参数为 true,您可以提高数据添加的性能。
    直接访问数据:
  • 如果直接访问和修改图形的数据,而不是使用 addData 函数,您可以使用 data 方法。这将返回一个指向内部数据容器的指针,允许您直接操作数据。

总的来说,addData 函数提供了一种简单、高效的方法,可以将新的数据点添加到 QCustomPlot 图形中,而无需重新设置整个数据集。这在动态更新图形或逐步构建图形时特别有用。

void QCPGraph::addData ( double key, double value )
设置数据点

2.9 selectTest

double QCPGraph::selectTest ( const QPointF & pos, bool onlySelectable, QVariant * details = nullptr ) const virtual

QCPGraph::selectTest是QCPGraph类的一个虚拟函数,用于检查某一点(如鼠标点击位置)是否接近该图形。它对于点选图形、数据点或者其他相关操作非常有用。

这个函数接受几个参数:

  • pos: 这是一个QPointF对象,通常表示你想测试的点的坐标(例如,用户点击的位置)。
  • onlySelectable: 是一个布尔值,当设置为true时,该函数只考虑那些已经被标记为可选的数据点。
  • details: 是一个指向QVariant的指针,如果不是nullptr,它将被设置为描述距离pos最近的数据点的QCPDataSelection对象。

函数返回一个double值,表示pos与图上最近的数据点之间的距离。返回的这个距离值可用于判断用户点击的是否是一个有效的数据点,或者在多个图形重叠时,判断用户点击的是哪一个图形。

如果details不是nullptr,你可以从中获取更多关于所选数据点的信息。

例如,当用户点击图形上的某个位置时,可以使用此函数来判断他们是否点击了一个数据点,并如果是,找出具体点击了哪一个数据点。

2.10 getKeyRange

QCPRange QCPGraph::getKeyRange ( bool & foundRange, QCP::SignDomain inSignDomain = QCP::sdBoth ) const

QCPGraph::getKeyRange函数返回图形数据在键(通常是x轴)方向上的范围。该函数非常有用,尤其是当你想自动调整x轴的范围以适应所有数据点时。

函数参数:

  • foundRange (输出参数):一个布尔值,指示是否找到有效的范围。如果数据为空,此参数将为false。
  • inSignDomain (可选的输入参数):这是一个枚举值,它告诉函数是否只考虑正数、负数或两者。默认情况下,它将考虑所有数据点。

以下是如何使用getKeyRange函数的示例:

bool found;
QCPRange range = ui->customPlot->graph(0)->getKeyRange(found);

if (found)
{
    // 将x轴的范围设置为找到的范围
    ui->customPlot->xAxis->setRange(range);
    ui->customPlot->replot();  // 重新绘制图形
}
else
{
    qDebug() << "没有找到有效的范围!";
}

在上面的示例中,我们首先使用getKeyRange函数获取图形在x轴方向上的范围。然后,如果找到了有效的范围,我们将x轴的范围设置为该范围,并重新绘制图形。

2.11 getValueRange

QCPRange QCPGraph::getValueRange ( bool & foundRange, QCP::SignDomain inSignDomain = QCP::sdBoth, const QCPRange & inKeyRange = QCPRange() ) const
同上

2.12 dataCount

template<class DataType> int QCPAbstractPlottable1D< DataType >::dataCount ( ) const
它返回绘图数据中的数据点数量。

2.13 dataMainKey

template<class DataType > double QCPAbstractPlottable1D< DataType >::dataMainKey ( int index) const
返回给定索引出的key值

2.14 dataMainValue

template<class DataType > double QCPAbstractPlottable1D< DataType >::dataMainValue ( int index) const
返回给定索引处的value值

2.15 dataSortKey

template<class DataType > double QCPAbstractPlottable1D< DataType >::dataSortKey ( int index) const
返回给定索引处的排序键值。在许多场景中,排序键与主键是一样的,但在某些特定的数据类型中,它们可能不同。

2.15 dataValueRange

template<class DataType > QCPRange QCPAbstractPlottable1D< DataType >::dataValueRange ( int index) const
QCPAbstractPlottable1D::dataValueRange 是一个模板成员函数,用于从1D可绘制数据项中获取指定索引处的数据点的值范围。

  • 参数:
    index: 你想查询的数据点的索引。
  • 返回值:
    QCPRange 对象,代表数据点的值范围。对于大多数普通图形,这通常是一个具体的y值(在这种情况下,QCPRange 的上界和下界会是相同的)。但对于其他类型的图表,如误差条形图,这可能会是一个实际的范围。
  • 关键点:
    函数的行为依赖于 DataType,它是你使用QCustomPlot库中特定的数据结构或类型时的模板参数。
    这个 DataType 定义了什么是"值范围"。对于基本的x-y点图,值范围可能只是y值。但是,对于其他更复杂的数据类型,它可能是一个实际的范围,例如误差条形图中的最小值和最大值。

2.16 dataPixelPosition

template<class DataType > QPointF QCPAbstractPlottable1D< DataType >::dataPixelPosition ( int index) const
用于获取给定索引处的数据点在widget表面上的像素位置。

  • 参数:
    index: 你想查询的数据点的索引。
    返回值:
    QPointF 对象,表示数据点在widget表面上的像素位置。x坐标代表横轴上的位置,而y坐标代表纵轴上的位置。
    关键点:

该函数返回的位置通常与dataMainKey/dataMainValue相对应的像素坐标相匹配。但是,根据可绘制物的类型,这可能与这些值的坐标到像素的简单转换不同。例如,QCPBars的明显数据值可能会因其堆叠、条形分组或配置的基值而有所不同。

这意味着,对于某些图形类型(如堆叠的条形图),数据点的实际值和它在屏幕上的像素位置可能会有所不同,因为它可能受到其他因素的影响。

使用这个函数可以帮助你准确地确定一个数据点在屏幕上的位置,无论它的实际数据值是多少。

2.17 sortKeyIsMainKey

template<class DataType > bool QCPAbstractPlottable1D< DataType >::sortKeyIsMainKey ( ) const
用于确定排序键(dataSortKey)是否与主键(dataMainKey)相同。

此函数用于某些情况,特别是当你需要知道数据是否根据它们的主键进行排序时,它会非常有用。

函数返回值:
true: 如果排序键和主键相同。
false: 如果排序键和主键不同。
背景知识:
在许多情况下,数据的主键也是排序键,这意味着数据是按照它们的主键值排序的。但在某些情况下,可能会有一个不同的排序键。
示例:
假设你有一个时间序列数据,其中主键是时间戳,数据可能按照这些时间戳排序。在这种情况下,排序键和主键是相同的。但是,也可能有一种情况,数据是按照另一个属性(例如温度)排序的,这时排序键和主键就不同了。

2.18 selectTestRect

QCPDataSelection selectTestRect ( const QRectF & rect, bool onlySelectable ) const
这个函数 QCPDataSelection QCPAbstractPlottable1D< DataType >::selectTestRect(const QRectF & rect, bool onlySelectable) const 提供了一个基于给定矩形区域的数据选择算法。该算法假设数据(通过1D数据接口访问)呈现为点状。

函数的主要参数和目的是:

rect (QRectF) - 这是一个浮点矩形,代表我们希望测试或选择的区域。
onlySelectable (bool) - 如果为 true,则只考虑那些被标记为可选择的数据点。如果为 false,则考虑所有数据点。
函数返回一个 QCPDataSelection 对象,该对象描述了在给定的矩形区域内选中的数据点。

该方法的默认实现是基于数据点呈现为点状的假设。然而,许多子类可能会有不同的数据可视化几何形状(例如,柱状图、蜡烛图、箱形图等),因此它们可能希望重新实现此方法,以便提供基于真实数据可视化几何形状的更精确的选择测试。

函数末尾的注释提到,QCPBars、QCPFinancial 和 QCPStatisticalBox 这几个类已经重新实现了这个方法,这意味着这些类为数据选择提供了自定义的、特定于它们的可视化类型的方法。

2.19 findBegin

template<class DataType > int QCPAbstractPlottable1D< DataType >::findBegin ( double sortKey, bool expandedRange = true ) const

template<class DataType > int QCPAbstractPlottable1D< DataType >::findEnd ( double sortKey, bool expandedRange = true ) const

QCPAbstractPlottable1D::findBegin 是一个模板成员函数,其目的是在数据集中找到与给定的排序键(sortKey)相匹配或最接近的数据点的索引。这个函数在确定要操作的数据点子集,例如在某个范围内的数据点时,特别有用。

函数参数:

sortKey: 你要查找的键。
expandedRange: 如果为 true,它将返回 sortKey 下面的数据点的索引。如果为 false,它将返回 sortKey 上面的数据点的索引。
返回值:

数据点的索引,该点的键等于、刚刚低于或刚刚高于 sortKey。
使用场景:
假设你有一个时间序列数据,并且你想要处理某个特定时间范围内的数据点。使用 findBegin 和 findEnd,你可以确定这个范围的开始和结束索引,然后迭代处理这些数据点。

使用示例:

double startTime = ...;  // 设定你想开始的时间
double endTime = ...;    // 设定你想结束的时间

QCPGraph *graph = ui->customPlot->graph(0);  // 获取第一个图形
int startIndex = graph->findBegin(startTime, true);
int endIndex = graph->findEnd(endTime, true);

for (int i = startIndex; i < endIndex; ++i) {
    // 在此处理范围内的数据点
}

在上面的示例中,你首先设置了你想要的时间范围的开始和结束。然后,使用 findBegin 和 findEnd 来确定这个范围的开始和结束索引。最后,你可以迭代并处理这个范围内的数据点。

注意: 确保 DataType 与你正在操作的具体的可绘制数据项类型匹配。

2.20 interface1D

template<class DataType> QCPPlottableInterface1D * QCPAbstractPlottable1D< DataType >::interface1D ( )
QCPAbstractPlottable1D::interface1D 是一个模板成员函数,其主要目的是为实现了1D接口的可绘制项目提供一个指向其1D接口的指针。

在QCustomPlot库中,QCPPlottableInterface1D是一个接口,它定义了一组为1D数据图形(如线图和点图)提供的函数。这些函数使得外部用户能够查询和迭代图形的数据点,而无需关心其具体实现或内部数据结构。

函数返回:

指向这个可绘制项目的1D接口的QCPPlottableInterface1D指针。
使用场景:
当你想要以通用的方式访问一个可绘制项目的1D数据,而不关心它的具体实现或子类时,这个函数很有用。通过获取1D接口的指针,你可以调用定义在QCPPlottableInterface1D接口中的任何函数。

使用示例:

QCPGraph *graph = ui->customPlot->graph(0);  // 获取第一个图形
QCPPlottableInterface1D *interface = graph->interface1D();
double valueAtKey = interface->dataMainValue(10);  // 获取键为10的数据点的值

在上面的示例中,我们首先获取第一个图形的指针。然后,我们使用interface1D函数来获取其1D接口的指针。一旦我们有了这个接口,我们就可以调用任何在QCPPlottableInterface1D接口中定义的函数来查询和操作1D数据。

总之,QCPAbstractPlottable1D::interface1D函数提供了一种通用的方法来访问和操作实现了1D接口的可绘制项目的数据。

2.21 setName

QString name () const
void QCPAbstractPlottable::setName ( const QString & name)
允许你为可绘制的图形元素(如图、线、点等)指定一个名字

2.22 setAntialiasedFill

bool antialiasedFill () const
void QCPAbstractPlottable::setAntialiasedFill ( bool enabled)
函数用于设置图形元素的填充是否使用抗锯齿渲染。

  • 参数:
    enabled:一个布尔值。如果为 true,则此可绘制项目的填充将使用抗锯齿渲染;如果为 false,则不使用。
    使用抗锯齿可以使图形边缘更加平滑,减少锯齿状的外观,但可能会略微降低渲染性能。

需要注意的是,QCustomPlot 也提供了全局的设置来控制所有图形元素是否使用抗锯齿渲染:QCustomPlot::setAntialiasedElements 和 QCustomPlot::setNotAntialiasedElements。这些全局设置可能会覆盖单个图形元素上的 setAntialiasedFill 设置。

2.23 setAntialiasedScatters

void setAntialiasedScatters (bool enabled)
void QCPAbstractPlottable::setAntialiasedScatters ( bool enabled)
QCPAbstractPlottable::setAntialiasedScatters 函数用于设置此图形元素的散点符号(scatter symbols)是否使用抗锯齿渲染。

  • 参数:
    enabled:一个布尔值。如果为 true,则此可绘制项目的散点符号将使用抗锯齿渲染;如果为 false,则不使用。
    抗锯齿渲染能使图形元素的边缘更加平滑,从而得到更加美观的结果,但可能稍微降低渲染的性能。

然而,QCustomPlot 还提供了全局设置,这些设置可能会覆盖此图形元素上的 setAntialiasedScatters 设置。具体来说,QCustomPlot::setAntialiasedElements 和 QCustomPlot::setNotAntialiasedElements 函数可以用于控制所有图形元素是否使用抗锯齿渲染。

2.24 setPen

void QCPAbstractPlottable::setPen ( const QPen & pen)
函数用于设置图形元素在图中的基本线条的画笔。

2.25 setBrush

void QCPAbstractPlottable::setBrush ( const QBrush & brush)
函数用于设置图形元素的填充样式。

2.26 setKeyAxis

void QCPAbstractPlottable::setKeyAxis ( QCPAxis * axis)
函数用于设置与图形元素相关联的关键轴。

  • 参数:

axis:一个 QCPAxis 对象的指针,指定图形元素所依赖的关键轴。
在 QCustomPlot 绘图库中,每个图形元素(如线图、散点图等)都与两个轴相关联:一个关键轴(通常是 x 轴)和一个值轴(通常是 y 轴)。setKeyAxis 允许开发者为图形元素设置一个新的关键轴。例如,如果你有一个图表与左侧 y 轴和底部 x 轴相关联,但你希望将其与右侧的 y 轴或顶部的 x 轴关联起来,你可以使用此函数。
使用方法:

QCPGraph *graph = customPlot->addGraph();
graph->setKeyAxis(customPlot->xAxis2);  // 将图形的关键轴设置为顶部的 x 轴

在上述示例中,我们首先添加了一个新的图形元素,然后使用 setKeyAxis 将其关键轴设置为图表顶部的 x 轴(xAxis2)。

这个功能特别有用,例如,当你在图表中有多个轴并希望不同的图形元素与不同的轴关联时。通过使用 setKeyAxis 和 setValueAxis(用于设置值轴),你可以轻松地控制图形元素与哪个轴相关联。

2.27 setValueAxis

void QCPAbstractPlottable::setValueAxis ( QCPAxis * axis)
原理同上

2.28 setSelectable

void QCPAbstractPlottable::setSelectable ( QCP::SelectionType selectable)
这个函数setSelectable允许你设定一个QCPAbstractPlottable(如一个图形或其他可绘制项)是否可以被选中,以及其可以被选中的精度。

参数 QCP::SelectionType selectable 定义了如何选择这个图表:

QCP::stNone:图表不可选。
QCP::stWhole:整个图表作为一个单元被选中。
QCP::stSingleData:可以选择单个的数据点。
QCP::stMultipleDataRanges:可以选择多个数据范围。
QCP::stDataRange:可以选择一个数据范围。

在这之后,你可以结合使用QCustomPlot的交互功能来允许用户选择图表。例如,如果你希望允许用户通过鼠标点击来选择图表,你可以使用以下代码:

ui->widget->setInteractions(QCP::iSelectPlottables);

被选中中之后可以做什么呢?
比如选中这个点后,显示这个点的x,y值

以下是如何实现这一功能的基本步骤:

连接信号和槽:当一个数据点被选中时,QCustomPlot会发出一个plottableClick信号。你可以连接这个信号到你自己的槽函数中,以响应这个事件。

connect(ui->widget, SIGNAL(plottableClick(QCPAbstractPlottable*,int,QMouseEvent*)), this, SLOT(onPointSelected(QCPAbstractPlottable*,int)));
//在槽函数中处理:你可以在槽函数中获取被选中的数据点的坐标,并显示它们。

void YourClass::onPointSelected(QCPAbstractPlottable *plottable, int dataIndex)
{
    // 获取被选中的数据点
    double x = plottable->interface1D()->dataMainKey(dataIndex);
    double y = plottable->interface1D()->dataMainValue(dataIndex);
    
    // 显示x和y的值
    QString message = QString("Selected point: X = %1, Y = %2").arg(x).arg(y);
    QMessageBox::information(this, "Point Selected", message);
}

2.29 setSelection

void QCPAbstractPlottable::setSelection ( QCPDataSelection selection)
函数允许你设置这个图形元素(plottable)中哪些数据范围是被选择的。被选择的数据范围在图中的绘制方式是不同的(例如颜色),这可以通过选择装饰器来控制(参见 selectionDecorator)。

这个函数的参数:

selection:一个 QCPDataSelection 对象,定义了哪些数据范围是被选择的。
功能描述:
当 QCustomPlot::setInteractions 包含 iSelectPlottables 时,plottables 的整个选择机制都是自动处理的。只有当你希望通过编程方式改变选择状态时,才需要调用此函数。

使用 setSelectable,你可以进一步为每个图形元素指定它是否以及如何可以被选择。如果选择与通过 setSelectable 设置的当前 QCP::SelectionType 不兼容,那么结果选择将相应地进行调整(见 QCPDataSelection::enforceType)。

当 selected 与之前的选择状态不同时,此函数会发出 selectionChanged 信号。

使用示例:

QCPDataSelection selection;
selection.addDataRange(QCPDataRange(10, 15));  // 选择索引为10到15的数据
graph->setSelection(selection);

上述代码会选择图中索引为10到15的数据点。这些数据点在图上的绘制方式将与其他非选择的数据点不同。

2.30 setSelectionDecorator

void QCPAbstractPlottable::setSelectionDecorator ( QCPSelectionDecorator * decorator)

QCPAbstractPlottable::setSelectionDecorator 函数允许你设置一个自定义的 QCPSelectionDecorator(或其子类)实例。这使你可以更进一步自定义选定数据范围的视觉表示,而不仅仅是使用默认的 QCPSelectionDecorator。

  • 此函数的参数:
    decorator:一个指向 QCPSelectionDecorator(或其子类)实例的指针。
  • 功能描述:
  1. 图形元素(plottable)将拥有 decorator 的所有权。
  2. 你可以使用 selectionDecorator 方法来访问当前设置的装饰器。
  3. 使用此方法可以使你更加灵活地控制选定的数据范围在图表中的显示方式。例如,你可能想要为选定的数据点使用不同的颜色、大小或形状。
    使用示例:
QCPSelectionDecorator *customDecorator = new QCPSelectionDecorator();
customDecorator->setPen(QPen(Qt::blue));
customDecorator->setBrush(QBrush(Qt::yellow));
graph->setSelectionDecorator(customDecorator);

上述代码创建一个新的选择装饰器,并为选定的数据点设置蓝色的边框和黄色的填充。然后它使用 setSelectionDecorator 方法将这个装饰器应用到图形元素上。当这个图形元素的某些数据点被选中时,它们将使用这些自定义的颜色进行绘制。

2.31 coordsToPixels

void QCPAbstractPlottable::coordsToPixels ( double key, double value, double & x, double & y ) const
QCPAbstractPlottable::coordsToPixels 函数是一个便捷函数,用于将一个 key/value 对转换为 QCustomPlot 表面上的像素坐标。它考虑了与此图形元素关联的轴的方向(例如,key 是否表示 x 或 y)。

参数:

key:你希望转换的数据的键。
value:你希望转换的数据的值。
x 和 y:输出参数,表示转换后的像素坐标。
功能描述:

使用与此图形元素关联的轴的范围和缩放设置,将给定的 key 和 value 转换为 QCustomPlot 表面上的像素坐标。
转换后的像素坐标将写入 x 和 y。
使用示例:

double key = 5.0;
double value = 3.0;
double pixelX, pixelY;

graph->coordsToPixels(key, value, pixelX, pixelY);

qDebug() << "Pixel coordinates:" << pixelX << "," << pixelY;

上述代码将数据点 (5.0, 3.0) 转换为其在 QCustomPlot 表面上的像素坐标,并将其输出到控制台。

const QPointF QCPAbstractPlottable::coordsToPixels ( double key, double value ) const
QCPAbstractPlottable::coordsToPixels 这个重载函数提供了将给定的 key 和 value 转换为像素坐标,并将结果以 QPointF 的形式返回的功能。

  • 参数:
    key:你希望转换的数据的键。
    value:你希望转换的数据的值。
  • 返回值:
    QPointF:转换后的像素坐标。
  • 功能描述:
    使用与此图形元素关联的轴的范围和缩放设置,将给定的 key 和 value 转换为 QCustomPlot 表面上的像素坐标。
    转换后的像素坐标以 QPointF 的形式返回。
    使用示例:
double key = 5.0;
double value = 3.0;

QPointF pixelCoord = graph->coordsToPixels(key, value);

qDebug() << "Pixel coordinates:" << pixelCoord.x() << "," << pixelCoord.y();

上述代码将数据点 (5.0, 3.0) 转换为其在 QCustomPlot 表面上的像素坐标,并将其输出到控制台。

2.32 pixelsToCoords

void QCPAbstractPlottable::pixelsToCoords ( double x, double y, double & key, double & value ) const
void QCPAbstractPlottable::pixelsToCoords ( const QPointF & pixelPos, double & key, double & value ) const

这个函数(及其重载版本)提供了将像素坐标转换为图形坐标的功能。

参数:

x 和 y:在 QCustomPlot 表面上的像素坐标。
key 和 value:用于存储转换后的图形坐标。
功能描述:

使用与此图形元素关联的轴的范围和缩放设置,将像素坐标 x 和 y 转换为图形坐标。
转换后的图形坐标将存储在 key 和 value 中。
重载版本的功能描述:

直接将一个 QPointF 类型的像素坐标转换为图形坐标。
返回转换后的图形坐标。
使用示例:

double pixelX = 100.0;
double pixelY = 200.0;
double key, value;

graph->pixelsToCoords(pixelX, pixelY, key, value);

qDebug() << "Plot coordinates:" << key << "," << value;

另一个使用示例(使用重载版本):

QPointF pixelPos(100.0, 200.0);
double key, value;

graph->pixelsToCoords(pixelPos, key, value);

qDebug() << "Plot coordinates:" << key << "," << value;

上述两个示例都将像素坐标 (100.0, 200.0) 转换为其在图形中的坐标,并将其输出到控制台。

2.33 rescaleAxes

void rescaleAxes (bool onlyEnlarge=false) const
它可以自动调整轴的范围,使得与之相关联的数据都能完整地显示在图形中。

  • 参数:
    onlyEnlarge:一个布尔值,如果为 true,则只会扩大轴的范围,不会缩小。默认为 false。
  • 功能描述:
    调整与此图形元素相关的键和值轴的范围,使得所有的数据点都在轴的范围内。
    如果轴的缩放是对数的,这个功能将确保不会调整到一个非法的范围(例如,包含不同符号和/或零的范围)。在这种情况下,它会停留在当前的符号域,并忽略所有位于该域之外的部分。
  • 使用场景:
    当向图中添加新的数据点或者新的图形元素时,可能会超出当前轴的范围,此时可以使用此功能来自动调整轴,使得新的数据也能显示在图中。
    当有多个图形元素并且希望它们都完整地显示在图中时,可以首先调用 rescaleAxes(false),然后再对其它的图形元素调用 rescaleAxes(true)。
  • 使用示例:
// 假设有一个图形元素 graph1
graph1->rescaleAxes();  // 首先对 graph1 调整轴

// 假设还有另一个图形元素 graph2
graph2->rescaleAxes(true);  // 保证 graph2 也能完整显示,但不缩小轴的范围

通过上述调用,可以确保 graph1 和 graph2 都能完整地显示在图中。

void QCPAbstractPlottable::rescaleKeyAxis ( bool onlyEnlarge = false) const
原理同上,只对x轴操作

void QCPAbstractPlottable::rescaleValueAxis ( bool onlyEnlarge = false, bool inKeyRange = false ) const
原理同上,只对y轴操作

2.34 addToLegend

bool addToLegend (QCPLegend *legend)
函数允许您将此图形元素添加到指定的图例中。

  • 参数:
    legend:指定的QCPLegend对象,即您希望添加到的图例。
  • 功能描述:
    该函数会为此图形元素创建一个QCPPlottableLegendItem项,并将其插入到指定的图例中。
    如果函数成功地将图形元素添加到图例中(即图例存在且图形元素之前未添加到图例中),则返回true。否则返回false。
    使用注意事项:

如果您的图形元素需要在图例中有一个更特殊的表示(比如,除了默认的线型或颜色表示之外,您还想添加一些自定义文本或图形),那么您可以创建一个QCPPlottableLegendItem的子类,并手动添加到图例中,而不是调用此方法。
使用示例:

// 假设有一个 QCustomPlot 实例 named customPlot 和一个图形元素 named graph
QCPLegend *legend = customPlot->legend;
if (graph->addToLegend(legend)) {
    qDebug() << "Graph was successfully added to the legend.";
} else {
    qDebug() << "Failed to add graph to the legend.";
}

这段代码尝试将名为graph的图形元素添加到customPlot的图例中,并根据操作是否成功输出相应的消息。

bool QCPAbstractPlottable::addToLegend ( )

QCPAbstractPlottable::addToLegend 函数允许您将此图形元素添加到其父QCustomPlot的图例中。

  • 功能描述:
    该函数会为此图形元素创建一个QCPPlottableLegendItem项,并将其插入到其父QCustomPlot的图例中。
    如果函数成功地将图形元素添加到图例中(即图例存在且图形元素之前未添加到图例中),则返回true。否则返回false。
  • 使用注意事项:
    如果您的图形元素需要在图例中有一个更特殊的表示,那么您可以创建一个QCPPlottableLegendItem的子类,并手动添加到图例中,而不是调用此方法。
    使用示例:
// 假设有一个图形元素 named graph
if (graph->addToLegend()) {
    qDebug() << "Graph was successfully added to the parent QCustomPlot's legend.";
} else {
    qDebug() << "Failed to add graph to the legend.";
}

这段代码尝试将名为graph的图形元素添加到其父QCustomPlot的图例中,并根据操作是否成功输出相应的消息。

2.35 removeFromLegend

bool QCPAbstractPlottable::removeFromLegend ( QCPLegend * legend) const
QCPAbstractPlottable::removeFromLegend 函数允许您从指定的图例中移除此图形元素。

  • 功能描述:
    该函数会查找与此图形元素关联的QCPPlottableLegendItem项,并从指定的图例中移除它。
    如果函数成功地从图例中移除了图形元素(即图例存在且找到并移除了与图形元素关联的图例项),则返回true。否则返回false。
  • 使用注意事项:
    在移除图形元素之前,确保传入的图例实际上包含了与此图形元素关联的图例项。如果传入的图例不存在或与图形元素没有关联的图例项,该函数将返回false。
    使用示例:
// 假设有一个图形元素 named graph 和一个图例 named legend
if (graph->removeFromLegend(legend)) {
    qDebug() << "Graph was successfully removed from the specified legend.";
} else {
    qDebug() << "Failed to remove graph from the legend.";
}

这段代码尝试从名为legend的图例中移除名为graph的图形元素,并根据操作是否成功输出相应的消息。

bool QCPAbstractPlottable::removeFromLegend ( ) const

2.36 setVisible

bool visible () const
void QCPLayerable::setVisible ( bool on)
函数允许您设置QCPLayerable对象(及其所有派生类,例如图形、轴标签、标题等)的可见性。

2.37 setLayer

bool QCPLayerable::setLayer ( QCPLayer * layer)
QCPLayerable::setLayer 函数允许您更改QCPLayerable对象(及其所有派生类,例如图形、轴标签、标题等)的层。在QCustomPlot中,层被用来控制绘图元素的绘制顺序和堆叠顺序。

  • 功能描述:
    使用此函数可以将对象移动到指定的层。
    指定的层上已存在的对象会被新移动的对象所覆盖。
    如果将层设置为nullptr,该对象将不会被放置在任何层上,从而不会在图表中显示或接收事件。
  • 返回值:
    如果成功将对象的层更改为指定的层,则返回true。
    如果未能更改,例如因为指定的层不存在,则返回false。
  • 使用注意事项:
    更改对象的层可能会影响其在图表上的显示位置,因为它可能会被其他层上的对象覆盖或覆盖其他层上的对象。
    使用示例:
QCPLayer *newLayer = customPlot->addLayer("newLayer");
graph->setLayer(newLayer);  // 将名为graph的图形移动到名为newLayer的层上

上面的代码首先添加一个新层newLayer,然后将名为graph的图形移动到这个新层上。这意味着graph将会被绘制在该层上,并可能根据层的顺序覆盖或被其他层上的对象覆盖。
bool QCPLayerable::setLayer ( const QString & layerName)
QCPLayerable::setLayer 函数的这个重载允许您通过指定层的名称来更改QCPLayerable对象的层。它提供了与之前描述的基于QCPLayer指针的方法相同的功能,但通过使用层的名称来定位目标层。

  • 功能描述:
    使用此函数可以将对象移动到给定名称的层。
    指定的层上已存在的对象会被新移动的对象所覆盖。
    如果指定的层名称在QCustomPlot实例中找不到,此函数不会做任何事情并返回false。
  • 返回值:
    如果成功将对象的层更改为具有指定名称的层,则返回true。
    如果未能更改,例如因为层名称不存在,则返回false。
    使用注意事项:

更改对象的层可能会影响其在图表上的显示位置,因为它可能会被其他层上的对象覆盖或覆盖其他层上的对象。
确保您提供的层名称是存在的,否则此函数将不会有任何效果。
使用示例:

customPlot->addLayer("newLayer");
graph->setLayer("newLayer");  // 将名为graph的图形移动到名为"newLayer"的层上

上面的代码首先添加一个名为newLayer的新层,然后将名为graph的图形移动到这个新层上。这意味着graph将会被绘制在该层上,并可能根据层的顺序覆盖或被其他层上的对象覆盖。

2.38 setAntialiased

void QCPLayerable::setAntialiased ( bool enabled)
QCPLayerable::setAntialiased 函数允许您设置QCPLayerable对象是否应进行反锯齿处理。反锯齿是一种渲染技术,旨在通过对图像边缘进行平滑处理来减少视觉上的锯齿状效果,从而提供更清晰、更专业的图形输出。

  • 功能描述:
    当enabled参数设置为true时,该对象将进行反锯齿处理。
    当enabled参数设置为false时,对象将不进行反锯齿处理,可能导致锯齿状的边缘。
  • 使用考虑:
    开启反锯齿通常会使图像看起来更加平滑和专业。
    但是,反锯齿渲染通常需要更多的计算资源,这可能会导致性能下降,特别是当图表包含大量数据或需要频繁重绘时。

2.39 realVisibility

bool QCPLayerable::realVisibility ( ) const
QCPLayerable::realVisibility 函数用于确定一个QCPLayerable对象是否真正可见,这考虑到了layerable父对象的可见性和此layerable所在层的可见性。

  • 功能描述:
    当一个QCPLayerable对象、它的父对象和它所在的层都设置为可见时,此函数返回true。
    如果QCPLayerable对象、其父对象或其所在的层中的任何一个被设置为不可见,此函数返回false。
  • 使用情景:
    当需要确定一个layerable对象是否应该被绘制时,可以使用这个函数。因为有时即使layerable对象本身被设置为可见,但由于它的父对象或它所在的层被设置为不可见,它实际上是不可见的。
  • 示例:
if (item->realVisibility())
{
    // item是真正可见的,可以执行与其相关的操作
}

上述代码会检查名为item的layerable对象是否真正可见,并根据结果执行相关操作。

2

  1. xAxis2和yAxis2是默认不可见的,需要使用setVisible设置可见
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m晴朗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值