我想提出一个应用程序,我需要画一幅画上面的数字(即矩形),并调整整个场景。我正在使用QGraphicsView
和QGraphicsScene
。我无法弄清楚为什么,但是当我使用fitIntoView()
时,我无法在图片的顶部绘制数字(它们可能被绘制在图片的后面或边界之外)。放大缩小的QPixmap:无法恢复原来的大小
现在我使用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
。这是一个抓取鼠标事件的派生类,除了事件处理程序外,没有什么更多的了。我在我的窗口小部件的构造将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方法中的原始像素替换pixmap,但我无法保存数字的位置。
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:
我附图方法的简短说明:(虽然我个人并不认为这是问题,我m感兴趣的是有一种方法来缩放QGraphicsPixmapItem使用setScale(),以适应QGraphicsView大小)
我越来越start_
和end_
鼠标事件参数坐标(QMouseEvent *e)
end_=pw->mapToScene(e->pos());
start_=pw->mapToScene(e->pos());
我添加了数字上mousepress:
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;
}
我不明白为什么要扩展QPixmap。如果您想缩放图像并保持分辨率,则可以缩放QGraphicsPixmapItem。 – Fabio
Hi @Fabio!感谢您的答复!我缩放QPixmap,因为我可以将其缩放以适合宽度和高度,并且使用QGraphicsPixmapItem我必须以某种方式计算缩放比率,而我不知道该如何... :( – lena
)可以使用小于QGraphicsScene的图像大小,但我需要使大图像变小,据我所知我需要使用从0到1的缩放比例,但我有一个奇怪的结果,我只是尝试'setScale(0.5)',我期望QGraphicsPixmapItem有两倍的大小,但我只有一个包含原始图像部分的广场,我可以在这里错过什么? – lena