Curve Tracer

By using QCustomplot to draw a tracer on a 2D image, it is possible to draw a single QCPAxisRect. If using QCPItemStraightLine to draw lines, it is not possible to draw all rows and columns successfully. I hope a skilled technician can provide guidance. VarCurveTracer::VarCurveTracer(QCustomPlot* customplot, QCPAxisRect* rect, QCPGraph* graph, QColor color, QObject* parent) :QObject(parent) ,m_customplot(customplot) ,m_rect(rect) ,m_graph(graph) { if (!m_customplot) { qDebug() setClipAxisRect(m_rect); // 跟踪器样式 m_tracer->setStyle(QCPItemTracer::tsPlus); // 跟踪器的大小 m_tracer->setSize(20); m_tracer->setPen(QPen(Qt::red)); m_tracer->setBrush(Qt::red); m_tracer->position->setTypeX(QCPItemPosition::ptPlotCoords); m_tracer->position->setTypeY(QCPItemPosition::ptPlotCoords); // 绑定曲线,只在曲线的数据点上出现 m_tracer->setGraph(m_graph); // 新建数据点位置显示图标 m_label = new QCPItemText(m_customplot); // 绑定轴矩形,超出轴矩形的部分不会显示 m_label->setClipAxisRect(m_rect); m_label->setPadding(QMargins(3, 3, 3, 3)); // 边框颜色 m_label->setPen(QPen(Qt::black)); // 填充颜色 m_label->setBrush(QBrush(color)); // 根据颜色的亮度值自动翻转字体颜色 if (color.lightness() > 80) { m_label->setColor(Qt::black); } else { m_label->setColor(Qt::white); } m_label->setText(""); m_label->setTextAlignment(Qt::AlignLeft); m_label->setPositionAlignment(Qt::AlignRight); // 图标位置跟随跟踪器tracer变化 m_label->position->setParentAnchor(m_tracer->position); setVisible(false); } class VarCurveTracer : public QObject { Q_OBJECT public: explicit VarCurveTracer(QCustomPlot* customplot, \ QCPAxisRect* rect, \ QCPGraph* graph,\ QColor color, \ QObject* parent = nullptr); ~VarCurveTracer(); void setVisible(bool on); void updateTracerPosition(double key); private: QCustomPlot* m_customplot; QCPItemTracer* m_tracer; // 跟踪的点 QCPItemText* m_label; // 显示的数值 QCPAxisRect* m_rect; QCPGraph* m_graph; };

Feb 14, 2025 - 11:02
 0
Curve Tracer

By using QCustomplot to draw a tracer on a 2D image, it is possible to draw a single QCPAxisRect.

If using QCPItemStraightLine to draw lines, it is not possible to draw all rows and columns successfully. I hope a skilled technician can provide guidance.

VarCurveTracer::VarCurveTracer(QCustomPlot* customplot, QCPAxisRect* rect, QCPGraph* graph, QColor color, QObject* parent) 
    :QObject(parent)
    ,m_customplot(customplot)
    ,m_rect(rect)
    ,m_graph(graph)
{
    if (!m_customplot) {
        qDebug() << "m_customplot is null.";
        return;
    }

    // 新建跟踪器
    m_tracer = new QCPItemTracer(m_customplot);
    // 绑定轴矩形,超出轴矩形的部分不会显示
    m_tracer->setClipAxisRect(m_rect);
    // 跟踪器样式
    m_tracer->setStyle(QCPItemTracer::tsPlus);
    // 跟踪器的大小
    m_tracer->setSize(20);
    m_tracer->setPen(QPen(Qt::red));
    m_tracer->setBrush(Qt::red);

    m_tracer->position->setTypeX(QCPItemPosition::ptPlotCoords);
    m_tracer->position->setTypeY(QCPItemPosition::ptPlotCoords);
    // 绑定曲线,只在曲线的数据点上出现
    m_tracer->setGraph(m_graph);

    // 新建数据点位置显示图标
    m_label = new QCPItemText(m_customplot);
    // 绑定轴矩形,超出轴矩形的部分不会显示
    m_label->setClipAxisRect(m_rect);
    m_label->setPadding(QMargins(3, 3, 3, 3));
    // 边框颜色
    m_label->setPen(QPen(Qt::black));
    // 填充颜色
    m_label->setBrush(QBrush(color));
    // 根据颜色的亮度值自动翻转字体颜色
    if (color.lightness() > 80) {
        m_label->setColor(Qt::black);
    }
    else {
        m_label->setColor(Qt::white);
    }
    m_label->setText("");
    m_label->setTextAlignment(Qt::AlignLeft);
    m_label->setPositionAlignment(Qt::AlignRight);
    // 图标位置跟随跟踪器tracer变化
    m_label->position->setParentAnchor(m_tracer->position);

    setVisible(false);
}
class VarCurveTracer : public QObject
{
    Q_OBJECT

public:
    explicit VarCurveTracer(QCustomPlot* customplot, \
        QCPAxisRect* rect, \
        QCPGraph* graph,\
        QColor color, \
        QObject* parent = nullptr);
    ~VarCurveTracer();

    void setVisible(bool on);
    void updateTracerPosition(double key);

private:
    QCustomPlot* m_customplot;
    QCPItemTracer* m_tracer; // 跟踪的点
    QCPItemText* m_label; // 显示的数值
    QCPAxisRect* m_rect;
    QCPGraph* m_graph;
};

Image description