我使用 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)
下午好,我找到了问题的答案。 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);});
}
}
}