QCustomPlot中如何移动曲线
时间: 2024-12-29 21:10:43 浏览: 14
### 实现 QCustomPlot 中移动曲线的功能
为了实现在 `QCustomPlot` 绘制的图表中通过鼠标交互来移动曲线,可以通过重载鼠标的事件处理函数,并在这些函数内部调整曲线的数据点位置。下面是一个基于给定类结构的例子[^1]:
```cpp
class MyCustomPlot : public QCustomPlot {
Q_OBJECT
public:
explicit MyCustomPlot(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private slots:
void updateCurveData();
private:
QPointF m_lastMousePos; // 上一次鼠标位置
bool m_isDragging; // 是否正在拖动
};
MyCustomPlot::MyCustomPlot(QWidget *parent)
: QCustomPlot(parent), m_isDragging(false) {}
void MyCustomPlot::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton && graphCount()) {
m_lastMousePos = event->pos();
m_isDragging = true;
}
}
void MyCustomPlot::mouseMoveEvent(QMouseEvent *event) {
if (!m_isDragging || !graphCount())
return;
auto currentGraph = this->graph(0);
QVector<double> keys, values;
double deltaX = event->x() - m_lastMousePos.x();
double deltaY = event->y() - m_lastMousePos.y();
for (int i = 0; i < currentGraph->data()->size(); ++i) {
const auto &point = currentGraph->data()->at(i).mainValue();
keys.append(point.key + deltaX / width());
values.append(point.value - deltaY / height());
}
currentGraph->setData(keys, values);
replot();
m_lastMousePos = event->pos();
}
```
上述代码展示了如何捕捉用户的鼠标动作并相应地更新曲线上各点的位置。当检测到左键按下时启动拖拽模式,在拖拽过程中不断计算新的坐标值并重新设置图形数据。
对于更复杂的场景,比如多条曲线的同时操作或是特定范围内的平移,则需进一步扩展逻辑以满足需求。此外,还可以考虑加入一些辅助功能如缩放锁定比例、边界限制等提升用户体验。
阅读全文