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.