Вы должны узнать о принципе одиночной ответственности , где он указывает, что у каждого класса есть своя ответственность, и в этом случае он позволит избежать большого беспорядка.Ответственность за масштабирование возлагается на QGraphicsView, а не на MainWindow.
Для этого создается новый класс, который наследуется от QGraphicsView, и мы реализуем функцию масштабирования:
graphicsview.h
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QGraphicsView>
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget *parent=nullptr);
void setModifiers(const Qt::KeyboardModifiers &modifiers);
protected:
void wheelEvent(QWheelEvent *event) override;
private:
void applyZoom(double factor, const QPoint &fixedViewPos);
Qt::KeyboardModifiers m_modifiers;
const double base = 1.0015;
};
#endif // GRAPHICSVIEW_H
graphicsview.cpp
#include "graphicsview.h"
#include <QWheelEvent>
#include <QtMath>
GraphicsView::GraphicsView(QWidget *parent):
QGraphicsView(parent)
{}
void GraphicsView::setModifiers(const Qt::KeyboardModifiers &modifiers)
{
m_modifiers = modifiers;
}
void GraphicsView::wheelEvent(QWheelEvent *event)
{
if(event->modifiers() == m_modifiers){
double angle = event->orientation() == Qt::Vertical ? event->angleDelta().y(): event->angleDelta().x();
double factor = qPow(base, angle);
applyZoom(factor, event->pos());
}
}
void GraphicsView::applyZoom(double factor, const QPoint & fixedViewPos)
{
QPointF fixedScenePos = mapToScene(fixedViewPos);
centerOn(fixedScenePos);
scale(factor, factor);
QPointF delta = mapToScene(fixedViewPos) - mapToScene(viewport()->rect().center());
centerOn(fixedScenePos - delta);
}
Затем с помощью виджета продвижение , предлагаемогоQt Designer вставляется в графический интерфейс.И затем установите значения:
ui->rightView->setModifiers(Qt::AltModifier);
ui->leftView->setModifiers(Qt::ControlModifier);
Полный пример можно найти здесь .
С другой стороны, многие из приведенных примеров кодав SO предназначены только для демонстрации функциональности и не обязательно использоваться для реализации проектов, поскольку при наличии небольшого места здесь сжимается, иногда теряя читабельность.Например, я исходил из идеи ответа, который вы указали, но я правильно разделил его, чтобы получить чистый код.