如何使用按钮放大 QgraphicsView?
How to zoom in a QgraphicsView using pushbuttons?
我正在 Qt 上构建一个非常简单的图像编辑器 creator.I 我的图像显示在 QGraphicsView 上,我想让用户能够通过按钮放大和缩小。
我搜索了很多,找到了如何通过鼠标放大和缩小 wheel.As 我是 Qt 的新手,我无法将其调整为按钮,因为我不是很清楚所有内容.
我试过了(没有完全理解我在做什么)但结果不是 wanted.It 只放大一次而且相当 abruptly.I 想要更平滑的缩放和尽可能多的我想要的次数。
void MainWindow::on_pushButton_clicked(){
QMatrix matrix;
ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
matrix.scale(1.0,1.0);
ui->graphicsView->setMatrix(matrix);
ui->graphicsView->scale(1,-1);
}
如果你们能提供帮助,我将不胜感激
下面是我如何在 QGraphicsView 的子类中实现缩放。请注意,您需要传入不同的 "zoom" 值以获得不同的放大倍数,因为缩放因子是绝对值,而不是相对值。
(optMousePos 参数可以设置为指向一个 QPoint,指示该点应该是缩放变换的中心点,或者如果你不关心它,它可以保留为 NULL。我用它因为我根据用户转动鼠标滚轮来放大和缩小,而在这样做时,用户通常希望放大到他的鼠标点当前所在的位置,而不是朝向图形区域的中心)
qreal _zoom = 0.0;
[...]
void MyQGraphWidgetSubclass :: SetZoomFactor(qreal zoom, const QPoint * optMousePos)
{
if ((zoom != _zoom)&&(zoom >= 0.02f)&&(zoom <= 1000000.0f))
{
QPointF oldPos;
if (optMousePos) oldPos = mapToScene(*optMousePos);
// Remember what point we were centered on before...
_zoom = zoom;
QMatrix m;
m.scale(_zoom, _zoom);
setMatrix(m);
if (optMousePos)
{
const QPointF newPos = mapFromScene(oldPos);
const QPointF move = newPos-*optMousePos;
horizontalScrollBar()->setValue(move.x() + horizontalScrollBar()->value());
verticalScrollBar()->setValue(move.y() + verticalScrollBar()->value());
}
}
}
void MyQGraphWidgetSubclass :: wheelEvent(QWheelEvent* event)
{
QPoint pos = event->pos();
SetZoomFactor(_zoom*pow(1.2, event->delta() / 240.0), &pos);
event->accept();
}
我正在 Qt 上构建一个非常简单的图像编辑器 creator.I 我的图像显示在 QGraphicsView 上,我想让用户能够通过按钮放大和缩小。
我搜索了很多,找到了如何通过鼠标放大和缩小 wheel.As 我是 Qt 的新手,我无法将其调整为按钮,因为我不是很清楚所有内容.
我试过了(没有完全理解我在做什么)但结果不是 wanted.It 只放大一次而且相当 abruptly.I 想要更平滑的缩放和尽可能多的我想要的次数。
void MainWindow::on_pushButton_clicked(){
QMatrix matrix;
ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
matrix.scale(1.0,1.0);
ui->graphicsView->setMatrix(matrix);
ui->graphicsView->scale(1,-1);
}
如果你们能提供帮助,我将不胜感激
下面是我如何在 QGraphicsView 的子类中实现缩放。请注意,您需要传入不同的 "zoom" 值以获得不同的放大倍数,因为缩放因子是绝对值,而不是相对值。
(optMousePos 参数可以设置为指向一个 QPoint,指示该点应该是缩放变换的中心点,或者如果你不关心它,它可以保留为 NULL。我用它因为我根据用户转动鼠标滚轮来放大和缩小,而在这样做时,用户通常希望放大到他的鼠标点当前所在的位置,而不是朝向图形区域的中心)
qreal _zoom = 0.0;
[...]
void MyQGraphWidgetSubclass :: SetZoomFactor(qreal zoom, const QPoint * optMousePos)
{
if ((zoom != _zoom)&&(zoom >= 0.02f)&&(zoom <= 1000000.0f))
{
QPointF oldPos;
if (optMousePos) oldPos = mapToScene(*optMousePos);
// Remember what point we were centered on before...
_zoom = zoom;
QMatrix m;
m.scale(_zoom, _zoom);
setMatrix(m);
if (optMousePos)
{
const QPointF newPos = mapFromScene(oldPos);
const QPointF move = newPos-*optMousePos;
horizontalScrollBar()->setValue(move.x() + horizontalScrollBar()->value());
verticalScrollBar()->setValue(move.y() + verticalScrollBar()->value());
}
}
}
void MyQGraphWidgetSubclass :: wheelEvent(QWheelEvent* event)
{
QPoint pos = event->pos();
SetZoomFactor(_zoom*pow(1.2, event->delta() / 240.0), &pos);
event->accept();
}