我正在制作一个应用程序,需要在图片上方绘制图形(如矩形),并调整整个场景的大小。我使用
现在,我使用
在代码的缩放部分,我尝试用未缩放的副本替换pixmap,但我无法按比例缩放它与我的图形缩放相同。
任何帮助都将不胜感激!
我画出像这样的图形。
我在鼠标按下时添加图形:
QGraphicsView
和QGraphicsScene
。但是当我使用fitIntoView()
时,无法在图片上方绘制图形(它们可能被绘制在图片后面或超出了边界)。现在,我使用
QPixmap.scaled()
将图像适应于QGraphicsScene
。这很好用,除非我需要显示一个大图像然后对其进行缩放。因为我将图像缩小以适应,所以当我调用QGraphicsView.scale()
时,图像会缩小,而我找不到“缩放回”原始大小的方法。在代码的缩放部分,我尝试用未缩放的副本替换pixmap,但我无法按比例缩放它与我的图形缩放相同。
任何帮助都将不胜感激!
这里我加载图像并进行缩放
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
。这是一个派生类,用于抓取鼠标事件,除了事件处理程序的覆盖外,没有其他内容。我在我的小部件构造函数中添加了 PainterGraphicsView :
pw = new PainterGraphicsView();
ui->gridLayout_3->addWidget(pw);
每次加载新图像时,我都会重新创建场景:
scn = new QGraphicsScene(pw);
pw->setScene(scn);
QRect r = QRect(0,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());
我在鼠标按下时添加图形:
rect = new QGraphicsRectItem(start_.x(),start_.y(),1,1);
scn->addItem(rect);
我在鼠标移动时重新绘制图形
rect->setRect(Graphics::GetFigure(start_.x(),start_.y(),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;
}
QGraphicsView::scale
而不会导致你的覆盖层出现在屏幕外。 - cgmb