QWheelEvent имеет несвязанное поведение при масштабировании внутри QGraphicsView - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть пользовательский интерфейс с:

N.2 QGraphicsView

N.3 QCheckBoxes, как показано ниже:

enter image description here

Я использую QWheelEvent и клавишу CTRL для уменьшения масштаба внутри QGraphicsView (слева).Эта часть работает хорошо.

Я использую клавиши QWheelEvent и ALT для уменьшения масштаба внутри QGraphicsView (справа).У этой части есть проблема, потому что она вообще не масштабируется.

Когда нажаты оба CTRL и ALT, оба просмотра QGraphics должны увеличивать-уменьшать в той же точке, где у меня есть мышь, но увеличениеперемещайте оба изображения в странных направлениях.

Флажки устанавливаются следующим образом: Как только я запускаю интерфейс, левый QGraphicsView уже находится в режиме перетаскивания.Когда я нажимаю флажок, QGraphicsView становится доступным для выбора и может выполнять множество различных операций.То же самое для правого QGraphicsView.Когда установлен флажок «Масштаб», масштабирование увеличивается, если я рисую прямоугольник в области интересов в правильном направлении просмотра.Однако он не сбрасывается, если я рисую прямоугольник в левом направлении вида:

enter image description here

Поэтому в дополнение к QCheckbox я хочубыть в состоянии уменьшить масштаб с помощью QWheelEvent и клавиш CTRL и ALT, и я не уверен, влияют ли флажки каким-либо образом на мой QWheelEvent.Или, может быть, нет, и проблема заключается только в том, как я реализовал QWheelEvent.

Я не уверен, что я не делаю неправильно, я прочитал этот источник , и я нашел его достаточно полезным, однакоэто не решило проблему. Также эта была полезна для понимания функции QGraphicsView::scale().

Пожалуйста, пролите свет на этот вопрос.Ниже приведен наиболее важный исходный код, описывающий проблему:

mainwindow.h

private:
    bool ctrl_down = false; // to check if CTRL is pressed
    bool alt_down = false; // to check if ALT is pressed

protected:
    void keyPressEvent(QKeyEvent *event);
    void wheelEvent(QWheelEvent *event);
    void keyReleaseEvent(QKeyEvent *event);

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->leftView->installEventFilter(this);
    ui->rightView->installEventFilter(this);
}


void MainWindow::onRubberBandUpdate(const QRect &viewportRect, const QPointF &fromScenePoint, const QPointF &toScenePoint)
{
    if(viewportRect.isNull() && fromScenePoint.isNull() && toScenePoint.isNull())
    {
        if(ui->zoomSelect->isChecked())
        {
            ui->leftView->fitInView(QRectF(start, end), Qt::KeepAspectRatio);
            ui->rightView->fitInView(QRectF(start, end), Qt::KeepAspectRatio);
        }
        else
        {
            // Additional operations
        }
    }
    else
    {
        start = fromScenePoint;
        end = toScenePoint;
    }
}

void MainWindow::on_leftSidePan_toggled(bool checked)
{
    if(ui->leftSidePan->isEnabled())
    {
        if(checked)
        {
            ui->leftView->setDragMode(QGraphicsView::RubberBandDrag);
            ui->leftSidePan->setText("Left: Select");
        }
        else
        {
            ui->leftView->setDragMode(QGraphicsView::ScrollHandDrag);
            ui->leftSidePan->setText("Left: Drag");
        }
    }
}

void MainWindow::on_rightSidePan_toggled(bool checked)
{
    if(ui->rightSidePan->isEnabled())
    {
        if(checked)
        {
            ui->rightView->setDragMode(QGraphicsView::RubberBandDrag);
            ui->rightSidePan->setText("Right: Select");
        }
        else
        {
            ui->rightView->setDragMode(QGraphicsView::ScrollHandDrag);
            ui->rightSidePan->setText("Right: Drag");
        }
    }
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Control) { ctrl_down = true; }
    else if(event->key() == Qt::Key_Alt) { alt_down = true; }
}

void MainWindow::wheelEvent(QWheelEvent *event)
{
    if(ctrl_down) // Only left zoom
    {
        ui->leftView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
        ui->leftView->verticalScrollBar()->blockSignals(true);
        ui->leftView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

        QPointF pos = ui->leftView->mapToScene(event->pos());
        double DELTA = 1.0 + event->angleDelta().y() / 1200.0;
        QTransform xform = ui->leftView->transform();
        xform.translate(pos.x(), pos.y()); // origin to spot
        xform.scale(DELTA, DELTA); // scale
        xform.translate(-pos.x(), -pos.y()); // spot to origin
        ui->leftView->setTransform(xform);
        ui->leftView->update();
        event->accept();
    }
    else if(alt_down) // Only right zoom
    {
        ui->rightView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
        ui->rightView->verticalScrollBar()->blockSignals(true);
        ui->rightView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

        QPointF posr = ui->rightView->mapToScene(event->pos());
        double DELTAR = 1.0 + event->angleDelta().y() / 1200.0;
        QTransform yform = ui->rightView->transform();
        yform.translate(posr.x(), posr.y()); // origin to spot
        yform.scale(DELTAR, DELTAR); // scale
        yform.translate(-posr.x(), -posr.y()); // spot to origin
        ui->rightView->setTransform(yform);
        ui->rightView->update();
        event->accept();
 }
    if(alt_down && ctrl_down) // Both zoom
    {
        ui->leftView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
        ui->rightView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);

        ui->leftView->verticalScrollBar()->blockSignals(true);
        ui->leftView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        ui->rightView->verticalScrollBar()->blockSignals(true);
        ui->rightView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

        // For the Left View
        static const double scaleFactorTot = 1.1;
        static double currentScaleTot = 1.0;  // stores the current scale value.
        static const double scaleMinTot = .1; // defines the min scale limit.
        // For the Right View
        static const double scaleFactorTotR = 1.1;
        static double currentScaleTotR = 1.0;  // stores the current scale value.
        static const double scaleMinTotR = .1; // defines the min scale limit.

        if(event->delta() > 0)
        {
            ui->rightView->scale(scaleFactorTotR, scaleFactorTotR);
            currentScaleTotR *= scaleFactorTotR;
            ui->leftView->scale(scaleFactorTot, scaleFactorTot);
            currentScaleTot *= scaleFactorTot;
        }
        else if (currentScaleTot > scaleMinTot && currentScaleTotR > scaleMinTotR)
        {
            ui->rightView->scale(1 / scaleFactorTotR, 1 / scaleFactorTotR);
            currentScaleTotR /= scaleFactorTotR;
            ui->leftView->scale(1 / scaleFactorTot, 1 / scaleFactorTot);
            currentScaleTot /= scaleFactorTot;
        }
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Control) { ctrl_down = false; }
    if(event->key() == Qt::Key_Alt) { alt_down = false; }
}
...