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();

}

相关推荐
森G1 小时前
65、UDP协议(拓展选学)---------网络编程
网络·c++·qt·网络协议·tcp/ip·udp
JOJO数据科学2 小时前
鸿蒙PC迁移:KTouch Qt/QML 打字训练器适配全记录
qt·华为·harmonyos
闫有尽意无琼3 小时前
qt控件未指定父对象或delete致堆内存泄露
开发语言·qt
森G3 小时前
68、项目配置和示例---------多媒体
c++·qt
小白舒_SC11 小时前
多个VS版本的Qt VS Tools的QtMsBuild不兼容问题
经验分享·qt
金色熊族18 小时前
QTransform使用心得(二)--仿射变换、非仿射变换、矩阵
qt·线性代数·矩阵
乌托邦2号1 天前
Qt实现CS的自动化构建流程
qt·自动化
小短腿的代码世界1 天前
WebSocket协议在Qt中的工业级实现:5层架构设计与万级并发压测验证
qt·websocket·网络协议
金色熊族1 天前
Qt绘制图形时自定义点划线间隔的办法--setDashPattern
qt