以鼠标为中心缩放图片

void DisplayWidget::wheelEvent(QWheelEvent *event)
{
    int ImageWidth, ImageHeight;
    int LabelWidth = m_DisplayLabel->width();
    QImage *ImageShow = m_DisplayLabel->getImageShow();
    if(event->delta()>0)//如果向上滚动
    {
        ImageWidth = ImageShow->width() * 105 / 100;
        ImageHeight = ImageShow->height() * 105 / 100;
    }
    else
    {
        if((ImageShow->width()<50) ||(ImageShow->height()<50))//小于50会出现BUG
            return;
        ImageWidth = ImageShow->width() / 105.0 * 100;
        ImageHeight = ImageShow->height() / 105.0 * 100;
    }
    *ImageShow = m_DisplayLabel->setScaled(*m_DisplayLabel->getImageBuff(), ImageWidth, ImageHeight);//缩放
    int &&LabelSize = m_DisplayLabel->setLabelSize(ImageWidth, ImageHeight);
    int &&ScrollRangeX = LabelMoveDistance(event->pos().x(), m_DisplayLabel->x(), LabelWidth, LabelSize);
    int &&ScrollRangeY = LabelMoveDistance(event->pos().y(), m_DisplayLabel->y(), LabelWidth, LabelSize);
    m_DisplayLabel->move(m_DisplayLabel->x()-ScrollRangeX, m_DisplayLabel->y()-ScrollRangeY);
    m_DisplayLabel->showImage(*ImageShow);
}


设置Label大小

int DisplayLabel::setLabelSize( int Width,int Height)
{
    int DiagonalLenght = qSqrt(qPow(Width,2) + qPow(Height,2))+1;
    this->resize(DiagonalLenght,DiagonalLenght);
    return DiagonalLenght;
}



int DisplayWidget::LabelMoveDistance(const int &EventPos, const int &PastOffset,
                                     const int &PastSize, const int NewSize)
{
    int MousePoint = EventPos - PastOffset;//鼠标在图片上的坐标
    double Scale = MousePoint / (double)PastSize;//获取坐标比例
    int MouseMove = Scale * NewSize;//获得改变后鼠标在Label上的坐标
    int ScrollRange = MouseMove - MousePoint;//滚动后距离
    return ScrollRange;
}



你可能感兴趣的:(缩放,图片,qt)