QGgraphicsView鼠标缩放

// 20260615 鼠标缩放

void WorkInfoForm::wheelEvent(QWheelEvent* event) {

// 获取当前的鼠标所在的view坐标;

QPointF prev_viewPos = event->position();

// 获取当前鼠标相对于scene的位置;

QPointF prev_scenePos = ui->teach_graphicsView->mapToScene(prev_viewPos.toPoint());

//...计算缩放比例

// 2. 计算缩放因子

double scaleFactor = 1.15;

// 2. 定义最小和最大缩放比例

double currentScale = ui->teach_graphicsView->transform().m11();

复制代码
const double minScale = 1;  // 最小缩小到 10%
const double maxScale = 5.0;  // 最大放大到 500%

//double scaleFactor = 1.15;
bool willZoomIn = (event->angleDelta().y() > 0);

// 3. 计算缩放后的预期比例
double nextScale = willZoomIn ? (currentScale * scaleFactor) : (currentScale / scaleFactor);

// 4. 【关键】如果超出范围,则不执行缩放
if (willZoomIn && nextScale > maxScale) {
    return; // 超过最大限制,忽略本次操作
}
if (!willZoomIn && nextScale < minScale) {
    return; // 低于最小限制,忽略本次操作
}

if (willZoomIn) {
    ui->teach_graphicsView->scale(scaleFactor, scaleFactor);
}
else {
    ui->teach_graphicsView->scale(1 / scaleFactor, 1 / scaleFactor);
}
qDebug() << "缩放比:" << ui->teach_graphicsView->transform().m11();
//ui->teach_graphicsView->scale(scaleTemp, scaleTemp);  //缩放

//20260615 有问题 ui->teach_graphicsView->setSceneRect(ui->teach_graphicsView->mapToScene(this->rect()).boundingRect()); //调整scene,使得scene和view一直,主要是为了排除掉scroll

复制代码
//获取缩放后的scene坐标
QPointF scenePos = ui->teach_graphicsView->mapToScene(prev_viewPos.toPoint());
//获取缩放前后的坐标差值,即为需要进行move的位移
QPointF disPointF = scenePos - prev_scenePos;
//    qDebug()<<prev_scenePos<<" ::: "<<scenePos<<disPointF;
qDebug() << ui->teach_graphicsView->scene()->sceneRect();
//QRectF sceneRect = ui->teach_graphicsView->scene()->sceneRect();
//if (sceneRect.width() > 10000 || sceneRect.height() > 10000) {
//    sceneRect = sceneRect.normalized().adjusted(-5000, -5000, 5000, 5000);
//    ui->teach_graphicsView->scene()->setSceneRect(sceneRect);
//}
//ui->teach_graphicsView->horizontalScrollBar()->setValue(ui->teach_graphicsView->horizontalScrollBar()->value() + disPointF.x());
//ui->teach_graphicsView->verticalScrollBar()->setValue(ui->teach_graphicsView->verticalScrollBar()->value() + disPointF.y());
////调整位置
//ui->teach_graphicsView->scene()->setSceneRect(ui->teach_graphicsView->scene()->sceneRect().x() - disPointF.x(), ui->teach_graphicsView->scene()->sceneRect().y() - disPointF.y(),
// ui->teach_graphicsView->scene()->sceneRect().width(), ui->teach_graphicsView->scene()->sceneRect().height());
//    emit signal_wheel(m_scale);
ui->teach_graphicsView->scene()->update();

}

相关推荐
慧都小项4 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
Quz4 天前
QML SwipeDelegate 滑动委托
qt
Quz4 天前
QML 列表中的四种委托:ItemDelegate、CheckDelegate、RadioDelegate、SwitchDelegate
qt
实心儿儿4 天前
Qt — 显示类控件
qt
江湖人称菠萝包5 天前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5
扶尔魔ocy5 天前
【QT android】环境安装及第一个QT项目
qt·andriod开发
江湖人称菠萝包5 天前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter10-Data Visualization
笔记·qt·qt5
Cx330❀5 天前
Qt 常用控件属性与底层机制详解:从窗口半透明、浮点数陷阱到 QSS 与焦点策略
qt·ui·图形渲染
Quz5 天前
QML DelegateChooser:多条件组合与按列选择委托
qt
Quz5 天前
QML DelegateChooser:按角色选择委托与按索引选择委托
qt