QCustomPlot在其他场景下使用QWidget实现拖拽放大缩小
时间: 2024-02-17 07:00:28 浏览: 76
Qcustormplot 实现鼠标框选 放大缩小 拖拽 游标显示及吸附
5星 · 资源好评率100%
在使用QWidget实现拖拽放大缩小时,可以通过重载QWidget的mousePressEvent()、mouseMoveEvent()、mouseReleaseEvent()和wheelEvent()函数来实现。
1. 开启拖拽放大缩小功能
在QWidget的构造函数中,可以设置鼠标追踪,并开启拖拽放大缩小功能。
```
setMouseTracking(true);
ui->plotWidget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
```
2. 实现拖拽
在mousePressEvent()函数中,记录下鼠标位置,并设置m_isDragging标志位为true,表示正在进行拖拽操作。在mouseMoveEvent()函数中,根据鼠标位置的变化,调整绘图区域的范围,并重新绘制。
```
void MyWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_isDragging = true;
m_lastPos = event->pos();
}
}
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
if (m_isDragging) {
QPoint delta = event->pos() - m_lastPos;
m_lastPos = event->pos();
ui->plotWidget->axisRect()->moveRange(-delta.x(), delta.y());
ui->plotWidget->replot();
}
}
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_isDragging = false;
}
}
```
3. 实现放大缩小
在wheelEvent()函数中,根据鼠标滚轮的滚动距离,调整绘图区域的范围,并重新绘制。
```
void MyWidget::wheelEvent(QWheelEvent *event)
{
double factor = qPow(1.2, event->delta() / 240.0);
ui->plotWidget->axisRect()->setRangeZoomFactor(factor);
ui->plotWidget->axisRect()->setRangeZoom(Qt::Horizontal | Qt::Vertical);
ui->plotWidget->axisRect()->setRangeDrag(Qt::Horizontal | Qt::Vertical);
ui->plotWidget->replot();
}
```
以上代码应该放在QWidget的类定义中。在实际使用中,还需要在QWidget中添加QCustomPlot对象,并将QCustomPlot对象设置为QWidget的子对象。
```
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
ui->plotWidget = new QCustomPlot(this);
ui->plotWidget->setGeometry(10, 10, 500, 300);
// 设置QCustomPlot的属性和样式
// ...
setMouseTracking(true);
ui->plotWidget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
}
```
阅读全文