侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

qt – 缩小缩小的QPixmap:无法恢复原始大小

2023-05-03 星期三 / 0 评论 / 0 点赞 / 80 阅读 / 5086 字

我正在制作一个应用程序,我需要在图片上方绘制图形(即矩形)并调整整个场景的大小.我正在使用QGraphicsView和QGraphicsScene.我无法弄清楚为什么,但是当我使用fitIntoVie

... . . 我正在制作一个应用程序,我需要在图片上方绘制图形(即矩形)并调整整个场景的大小.我正在使用QGraphicsView和QGraphicsScene.我无法弄清楚为什么,但是当我使用fitIntoView()时,我无法在图片顶部绘制图形(它们可能是在图片后面或边界之外绘制的).

现在我使用QPixmap.scaled()使图像适合QGraphicsScene.它工作正常,除非我需要显示一个大图像,然后放大.因为我缩放图像以适应,它变得更小,当我调用QGraphicsView.scale()时,图像缩小为小,我找不到一种将图像“缩小”到原始尺寸的方法.

在代码的缩放部分,我试图用它没有缩放的副本替换像素图,但我不能用与我的图形缩放相同的比例缩放它.
任何帮助,将不胜感激!

在这里,我加载图像并缩放它

QPixmap pix;pix = pixmap->scaled(wid,hei,Qt::KeepAspectRatio,Qt::SmoothTransformation);scn = new QGraphicsScene(pw);pw->setScene(scn);p = new QGraphicsPixmapItem(pix);p->setPixmap(pix);scn->addItem(p);

我画这样的数字

rect = new QGraphicsRectItem(x,y,w,h);rect->setPen(QPen(getColor(),1,Qt::SolidLine,Qt::FlatCap));scn->addItem(rect);

这是我如何缩放

pw->scale(scaleFactor_,scaleFactor_);

更新:
现在我在顶部有一个带有工具栏的QWidget,其余的可用空间充满了自定义的QGraphicsView.这是一个用于抓取鼠标事件的派生类,除了事件处理程序之外别无选择.我在我的widget的构造函数中添加了PainterGraphicsView:

pw = new PainterGraphicsView();ui->gridLayout_3->addWidget(pw);

我每次加载新图像时都会重新创建场景:

scn = new QGraphicsScene(pw);pw->setScene(scn);QRect r = QRect(0,pw->width()-5,pw->height()-5);scn->setSceneRect(r);

加载图像后,我可以在其上绘制图形,它看起来像这样:

缩放内容如下所示:

正如您所看到的,数字与像素图一起缩放,这正是我需要它工作的方式.我唯一需要解决的是缩放像素图的低质量.正如我已经说过的,我尝试用我的ZoomIn方法中的原始像素替换像素图,但我无法保存数字的位置.

void DrawerWidget::on_btZoom_clicked(){    p->setPixmap(pix); //p is QGraphicsPixmapItem,pix is an original pixmap    p->setScale(0.5); //how can I scale the pixmap together with figures?? How to calculate the required scale?    pw->scale(scaleFactor_,scaleFactor_);}

更新2:

关于我的绘图数字方法的简短解释:(虽然我个人认为这不是问题,我感兴趣的是有一种方法可以使用setScale()来缩放QGraphicsPixmapItem以适应QGraphicsView大小)

我从鼠标事件参数(QMouseEvent * e)获取start_和end_坐标

end_=pw->mapToScene(e->pos()); start_=pw->mapToScene(e->pos());

我在mousepress上添加了这个数字:

rect = new QGraphicsRectItem(start_.x(),start_.y(),1);scn->addItem(rect);

我在鼠标移动时重绘了这个数字

rect->setRect(Graphics::GetFigure(start_.x(),end_.x(),end_.y()));

GetFigure是一个计算数字矩形的方法,这是它的主要部分:

static QRectF GetFigure(double startX,double startY,double finalX,double finalY)    {      QRectF shape;      shape.setX(startX);      shape.setY(startY);      shape.setWidth(qFabs(finalX - startX));      shape.setHeight(qFabs(finalY - startY));      return shape;   }
.

解决方法

. 缩放操作具有破坏性,一旦缩小,最终的数据就会少于开始时的数据.

如果您希望能够恢复原始大小,请保留原始像素图的副本.

您可以从原始的非缩放像素图创建QGraphicsPixmapItem,然后使用QGraphicsPixmapItem :: setScale(qreal)更改级别图形项目的大小,而不是级别像素图数据.这种方式缩放不应该具有破坏性,如果将其缩放到原始大小,则不应该失去质量.

如果你想缩放多个项目(而不是遇到不同的转换起源问题),你有几个选择:

>缩放整个视图 – 这将扩展所有内容
>将项添加为父项的子项,然后缩放父项也将缩放其子项

.

Item transformations accumulate from parent to child

.

>使用createItemGroup()将项添加到组:

.

The items are all reparented to the group,and their positions and transformations are mapped to the group

.. . .. ...

广告 广告

评论区