QGraphicsView Zoom in e out sob a posição do mouse usando a roda do mouse

Eu tenho um aplicativo com umQGraphicsView janela no meio da tela. Eu quero ser capaz de ampliar e reduzir usando uma rolagem de roda do mouse.

Atualmente eu reimplanteiQGraphicsView e substitui a função de rolagem do mouse para que ela não role a imagem (como acontece por padrão).

void MyQGraphicsView::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)
    {
        emit mouseWheelZoom(true);
    }
    else
    {
        emit mouseWheelZoom(false);
    }
}

Então, quando eu rolar, estou emitindo um sinal verdadeiro se a roda do mouse for para a frente se a roda do mouse estiver voltada para trás.

Eu conectei então este sinal a um slot (função de zoomver abaixo) na classe que lida com as minhas coisas GUI. Agora, basicamente eu acho que minha função de zoom não é a melhor maneira de fazer isso. Eu vi alguns exemplos de pessoas usando a função wheelevent overriden para definir escalas, mas eu realmente não consegui encontrar uma resposta completa.

Então, ao invés disso, eu fiz isso, mas ele não é perfeito de forma alguma, então estou procurando que isso seja ajustado um pouco ou para um exemplo de trabalho usando a escala na função de evento de roda.

Eu inicializom_zoom_level para0 no construtor.

void Display::zoomfunction(bool zoom)
{
    QMatrix matrix;

    if(zoom && m_zoom_level < 500)
    {
        m_zoom_level = m_zoom_level + 10;
        ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
        matrix.scale(m_zoom_level, m_zoom_level);

        ui->graphicsView->setMatrix(matrix);
        ui->graphicsView->scale(1,-1);
    }
    else if(!zoom)
    {
        m_zoom_level = m_zoom_level - 10;
        ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
        matrix.scale(m_zoom_level, m_zoom_level);

        ui->graphicsView->setMatrix(matrix);
        ui->graphicsView->scale(1,-1);
    }
}

Como você pode ver acima, estou usando umQMatrix e escalonando isso e definindo-o para o Graphicsview e definindo a âncora de transformação para sob o mouse, mas ele não está funcionando perfeitamente às vezes se eu estiver rolando carregamentos ele só começará a aproximar (o que eu acho que é fazer com o int looping sobre ou algo assim).

Como eu disse ajuda com isso ou um bom exemplo de escala sob o mouse seria ótimo.

questionAnswers(11)

yourAnswerToTheQuestion