QCustomPlot 使用鼠标缩放和重新定位图形的所有图层

问题描述 投票:0回答:1

我使用 qcustomplot 库和 qt5.15 在 qt 中编写
在一个 QCustomPlot 对象中创建了 n 个图形,我通过布局来实现这一点。

m_plot->plotLayout()->addElement(counter + offset, 0, axis);
m_plot->addGraphWithTracer(g, gp->element().label());
void CustomPlot::addGraphWithTracer(QCPGraph* graph, const QString& label)
{
    m_graphs.push_back(graph);
    m_labels.push_back(label);
    auto tracer = new CustomTracer(this);
    tracer->setGraph(graph);
    tracer->setGraphKey(5);
    tracer->setStyle(QCPItemTracer::tsNone);
    tracer->setInterpolating(true);
    tracer->setPen(QPen(Qt::red));
    tracer->setBrush(Qt::red);
    tracer->setSize(7);
    tracer->setClipToAxisRect(false);
    m_tracers.push_back(tracer);
}

我想添加使用鼠标缩放和移动图形的功能。文档中,有一个实现,但不幸的是,它只要求鼠标所在的布局,而我需要一切。

也许有人知道如何从其他层触发事件。

图表示例:

文档:https://www.qcustomplot.com/index.php/tutorials/userinteractions

customPlot->setInteraction(QCP::iRangeDrag, true)
customPlot->setInteraction(QCP::iRangeZoom, true)
c++ qt qt5 qcustomplot
1个回答
0
投票

下午好,我找到了问题的答案。 QCustomPlot 有一个 QCPAxis 类,它有一个 rangeChange 信号,它可以添加到另一个图的 lambda 中,因此,当一个图发生变化时,另一个图也会发生变化。 示例代码:

for(int i = 0; i < QCustomPlot::axisRectCount(); i++)
        {
            for(int j = i+1; j < QCustomPlot::axisRectCount(); j++)
            {
                auto firstAxisRect = axisRect(i)->axes();
                auto secondAxisRect = axisRect(j)->axes();
                for(int k = 0; k < firstAxisRect.size(); k++)
                {
                    connect(
                        firstAxisRect[k],
                        QOverload<const QCPRange &>::of(&QCPAxis::rangeChanged),
                        [x = secondAxisRect[k]](
                            const auto& range){ x->setRange(range);});
                    connect(
                        secondAxisRect[k],
                        QOverload<const QCPRange &>::of(&QCPAxis::rangeChanged),
                        [x = firstAxisRect[k]](
                            const auto& range){ x->setRange(range);});
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.