qt下怎么保持图片用滚轮缩放不失真啊,新手请大神指点

a287740928 2013-06-28 11:55:38
rt,现在想实现一个功能是缩放能在图片中心位置进行缩放,二是缩放不要失真,不知道为什么总是失真,新手求指导

代码:
#include "kk.h"

KK::KK(QWidget *parent)
: QWidget(parent,Qt::FramelessWindowHint)
{
pix.load( "picture.JPG",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
resize(pix.size());
// setMask(pix.mask());
}

void KK::mousePressEvent(QMouseEvent *event)
{
if (event->button()==Qt::LeftButton)
{
point=event->globalPos()-frameGeometry().topLeft();//globalPos()获取根窗口的相对路径,frameGeometry().topLeft获得主窗口左上角的位置
event->accept();
}
if(event->button()==Qt::RightButton)
{
close();
}
}

void KK::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons()==Qt::LeftButton)
{
move(event->globalPos()-point);
event->accept();
}

}

void KK::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0,0,pix);//绘制图片到窗口
}

void KK::wheelEvent(QWheelEvent *event)
{
int numDegrees = event->delta()/8;
int numSteps=numDegrees/15;
qreal width = pix.width();
qreal height = pix.height();
pix=pix.scaled(width*(1+numSteps*0.15), height*(1+numSteps*0.15), Qt::KeepAspectRatio,Qt::SmoothTransformation);
resize(pix.size());
}

KK::~KK()
{

}
...全文
831 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_18591167 2015-04-22
  • 打赏
  • 举报
回复
可以把实现的代码看看嘛 谢谢
a287740928 2013-08-07
  • 打赏
  • 举报
回复
引用 4 楼 czarten 的回复:
计算缩放后左上角坐标的变化,然后移动图片位置?
这个方法比较简单,已经实现了!谢谢
你怎么了熊吉 2013-07-06
  • 打赏
  • 举报
回复
计算缩放后左上角坐标的变化,然后移动图片位置?
a287740928 2013-06-28
  • 打赏
  • 举报
回复
引用 2 楼 gooderfeng 的回复:
如果可以的话,可以用qml 来实现类似的功能,超级简单
经过摸索现在已经成功无损缩放了,但是还是无法在图片中心缩放,请问改代码,qml还没学呢,谢谢了
#include "kk.h"

KK::KK(QWidget *parent)
    : QWidget(parent,Qt::FramelessWindowHint)
{
    pix.load( "picture.JPG",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
    resize(pix.size());
    width = pix.width();
    height = pix.height();
   // setMask(pix.mask());
}

void KK::mousePressEvent(QMouseEvent *event)
{
    if (event->button()==Qt::LeftButton)
    {
        point=event->globalPos()-frameGeometry().topLeft();//globalPos()获取根窗口的相对路径,frameGeometry().topLeft获得主窗口左上角的位置
        event->accept();
    }
    if(event->button()==Qt::RightButton)
    {
        close();
    }
}

void KK::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons()==Qt::LeftButton)
    {
        move(event->globalPos()-point);
        event->accept();
    }

}

void KK::paintEvent(QPaintEvent *event)
{
    QRectF target(0, 0, pix.width(),pix.height());
    QRectF source(0.0, 0.0, width, height);
    QPainter painter(this);
    painter.drawPixmap(source, pix, target);
    //painter.drawPixmap(0,0,pix);//绘制图片到窗口
}

void KK::wheelEvent(QWheelEvent *event)
{
    int numDegrees = event->delta()/8;
    int numSteps=numDegrees/15;
    width=width*(1+numSteps*0.15);
    height=height*(1+numSteps*0.15);
    //pix=pix.scaled(width*(1+numSteps*0.15), height*(1+numSteps*0.15), Qt::KeepAspectRatio,Qt::SmoothTransformation);
    //update();
    resize(width,height);

}

KK::~KK()
{
    
}
gooderfeng 2013-06-28
  • 打赏
  • 举报
回复
如果可以的话,可以用qml 来实现类似的功能,超级简单
gooderfeng 2013-06-28
  • 打赏
  • 举报
回复
painter.setRenderHint(QPainter::Antialiasing, true) 会有作用吗

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧