• 38846阅读
  • 13回复

[提问]可以让QGraphicsScene自动适应QGraphicsView的大小吗? [复制链接]

上一主题 下一主题
离线luckyyoung
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-08
回复本帖可获得10RMB金钱奖励!
每人最多可获奖1次,奖池剩余30RMB金钱 (中奖几率10%)
        我编写了一个图片浏览的程序。大体是这样的:将单张图片通过addPixmap函数加入到QGraphicsScene的实例scene中,再将scene设为QGraphicsView的Scene。这样使用QGraphicsView的scale函数可以很方便的进行图片的缩放。这个功能已实现。
        现在我想让图片加载时或在多次缩放后,能够自动根据QGraphicsView窗口的大小将图片缩放至适应大小,恰好全显示在QGraphicsView的窗口中。我试了好几个返回窗口大小的函数,其返回的大小好像都不会随着我缩放的大小而改变。比如scene->width()或者scene->height(),无论我怎么缩放,这个值好像都是不变的。无法获得多次缩放后的大小也就无法确定调整至适应大小时的缩放比。。。
      不知道各位大神有什么办法帮我实现这一功能?
本帖提到的人: @XChinux @dbzhang800 @roywillow
Anything is possible!
离线kimtaikee

只看该作者 1楼 发表于: 2014-05-08
你试试根据QGraphicsView的viewport()试试.

离线dbzhang800

只看该作者 2楼 发表于: 2014-05-08
QGraphicsView::fitInView() 试过了么?
离线luckyyoung

只看该作者 3楼 发表于: 2014-05-08
回 kimtaikee 的帖子
kimtaikee:你试试根据QGraphicsView的viewport()试试. (2014-05-08 09:09) 

viewport()里的width()和height()我也调用过,发现返回的也是不随缩放而改变的定值。
Anything is possible!
离线luckyyoung

只看该作者 4楼 发表于: 2014-05-08
回 dbzhang800 的帖子
dbzhang800:QGraphicsView::fitInView() 试过了么? (2014-05-08 10:28) 

看到这个函数了,但是不太会用。尤其是前面两个参数不知道是什么意思?
Anything is possible!
离线luckyyoung

只看该作者 5楼 发表于: 2014-05-08
回 dbzhang800 的帖子
dbzhang800:QGraphicsView::fitInView() 试过了么? (2014-05-08 10:28) 

void fitInView ( qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio )
我试过后发现图片不居中了。
Anything is possible!
离线luckyyoung

只看该作者 6楼 发表于: 2014-05-08
我把目前写了的部分的源码打包上传到百度云了,求指导
http://pan.baidu.com/s/1jGHV38M
Anything is possible!
离线roywillow

只看该作者 7楼 发表于: 2014-05-08
使用了这个框架似乎就注定了与坐标变换的永久奋斗……
你是希望让图片始终充满窗口,所以我想你可能需要对这个图片或者scene的可视区域进行缩放
缩放的因子我觉得可以通过图片大小与可视区域大小相比来获得
addPixmap应该会返回一个item吧……?如果有的话对这个item调用setScale()应该就行了。不过在此之前可能需要对item进行setTransformOriginPoint(),让item的缩放以他的某个中心进行
或者我记得scene还是view本身就有setScale()?或许直接调用这个会更好一些?
2条评分好评度+1金钱+5
luckyyoung 好评度 +1 确实addPixmap有返回值QGraphicsPixmapItem,嗯,是个思路,我试试这几个 2014-05-08
luckyyoung 金钱 +5 确实addPixmap有返回值QGraphicsPixmapItem,嗯,是个思路,我试试这几个 2014-05-08
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线roywillow

只看该作者 8楼 发表于: 2014-05-08
view有个setSceneRect(),scene有个itemsBoundingRect(),可能会对你有用?
如果是想找到当前view的显示区域是scene的什么地方的话,可以考虑view.mapToScene(view.viewport()->rect())
如果想把这个区域转换到item的坐标系中的话,可以考虑item.mapFromScene()
总之各种坐标转换,慢慢考虑
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线luckyyoung

只看该作者 9楼 发表于: 2014-05-08
确实addPixmap有返回值QGraphicsPixmapItem,嗯,是个思路,我试试这几个
离线luckyyoung

只看该作者 10楼 发表于: 2014-05-09
试了好些个办法,我还是用最笨的办法解决了。。。
既然无法获取多次缩放后,scene的大小,我就自己设置了两个变量来存储scene缩放后的长、宽。虽然笨,不过能解决问题。
Anything is possible!
离线luckyyoung

只看该作者 11楼 发表于: 2014-05-09
谢谢各位大神的解答和思路
Anything is possible!
离线bluesky0318

只看该作者 12楼 发表于: 2015-12-11
源码取消了?
离线xuhaiyang

只看该作者 13楼 发表于: 2023-11-15
回 dbzhang800 的帖子
dbzhang800:QGraphicsView::fitInView() 试过了么? (2014-05-08 10:28) 

有用哎,我遇到情况是QWidght里QGraphicsView,窗口变化QGraphicsView位置不对
快速回复
限100 字节
 
上一个 下一个