Я создаю очень простой графический редактор для создателя Qt. У меня есть мое изображение, отображаемое в QGraphicsView, и я хочу дать пользователю возможность увеличивать и уменьшать масштаб с помощью кнопки.
Я много искал и нашел, как увеличивать и уменьшать масштаб с помощью колесика мыши. Поскольку я очень новичок в Qt, я не могу настроить его на кнопку, потому что я не все ясно понимаю.
Я попробовал это (не понимая полностью, что я делаю), но результат не в розыске. Он увеличивается только один раз и довольно резко. Я хочу более плавный зум и столько раз, сколько я хочу.
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();
}
Других решений пока нет …