QCPDataRange类

描述由开始和结束索引给出的数据范围
QCPDataRange包含两个整数,用于描述一组连续数据点的开始和结束索引。结束索引对应于数据范围最后一个数据点之后的数据点,就像在标准迭代器中一样。

数据范围不绑定到某个可绘图对象,因此可以自由交换、创建和修改。如果要描述非连续数据集,则使用QCPDataSelection类,该类保存和管理QCPDataRange的多个实例。因此,在大多数情况下,使用QCPDataSelect。QCPDataRange和QCPDataSelect都提供了使用它们的便利方法,例如有界、扩展、相交、相交、调整、包含。此外,加法和减法运算符可用于连接/减去数据范围和数据选择(或混合),以检索相应的QCPDataSelect。

QCustomPlot的数据选择“数据选择机制”基于QCPDataSelect和QCPDataRange。

注意不要将QCPDataRange与QCPRange混淆。QCPRange描述浮点图坐标中的间隔,例如当前轴范围。

class QCP_LIB_DECL QCPDataRange
{
public:
  QCPDataRange();
  QCPDataRange(int begin, int end);
  
  bool operator==(const QCPDataRange& other) const { return mBegin == other.mBegin && mEnd == other.mEnd; }
  bool operator!=(const QCPDataRange& other) const { return !(*this == other); }
  
  // getters:
  int begin() const { return mBegin; }
  int end() const { return mEnd; }
  int size() const { return mEnd-mBegin; }
  int length() const { return size(); }
  
  // setters:
  void setBegin(int begin) { mBegin = begin; }
  void setEnd(int end)  { mEnd = end; }
  
  // non-property methods:
  bool isValid() const { return (mEnd >= mBegin) && (mBegin >= 0); }
  bool isEmpty() const { return length() == 0; }
  QCPDataRange bounded(const QCPDataRange &other) const;
  QCPDataRange expanded(const QCPDataRange &other) const;
  QCPDataRange intersection(const QCPDataRange &other) const;
  QCPDataRange adjusted(int changeBegin, int changeEnd) const { return QCPDataRange(mBegin+changeBegin, mEnd+changeEnd); }
  bool intersects(const QCPDataRange &other) const;
  bool contains(const QCPDataRange &other) const;
  
private:
  // property members:
  int mBegin, mEnd;

};
Q_DECLARE_TYPEINFO(QCPDataRange, Q_MOVABLE_TYPE);

QCPDataSelection 类

选择前

选择后

                                                数据选择

描述: 通过持有多个 QCPDataRange 实例来描述数据集。

核心功能

QCPDataSelection 通过管理多个 QCPDataRange 实例,可以表示任何(可能不连续的)数据选择集合。

主要操作

数据选择修改:

  • 使用 加法 和 减法 运算符(接受 QCPDataSelection 和 QCPDataRange 实例)

  • 使用addDataRange 和 clear 等方法

数据读取访问:

  • dataRange - 获取特定数据范围

  • dataRanges - 获取所有数据范围

  • dataRangeCount - 获取数据范围数量

  • 等其他方法

简化处理

simplify 方法用于合并直接相邻甚至重叠的 QCPDataRange 实例。

  • 使用加法/减法运算符时,QCPDataSelection 会自动简化

  • 唯一需要用户手动调用 simplify 的情况是:使用 addDataRange 时显式将 simplify 参数设为 false

  • 这在需要连续添加多个数据范围且希望避免每次迭代后简化开销时很有用

  • 在此情况下,完成操作后应确保调用 simplify

类型强制

使用 enforceType 使数据选择符合 QCP::SelectionType 中定义的选择约束条件。

架构关系

QCustomPlot 的数据选择机制基于 QCPDataSelection 和 QCPDataRange。

遍历数据选择示例

以下代码片段演示如何计算图形数据选择的平均值:

 
double sum = 0;
int dataCount = 0;
QCPDataSelection selection = graph->selection(); // 假设获取图形的选择

// 遍历选择中的所有数据范围
for (int i=0; i<selection.dataRangeCount(); ++i)
{
    QCPDataRange dataRange = selection.dataRange(i);
    
    // 遍历当前数据范围内的所有数据点
    for (int j=dataRange.begin(); j<dataRange.end(); ++j)
    {
        sum += graph->data()->at(j)->value; // 累加值
        dataCount++; // 计数
    }
}

double average = sum / dataCount; // 计算平均值

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐