• 11140阅读
  • 12回复

【求教->已解决】关于Graphics View的问题 [复制链接]

上一主题 下一主题
离线davis45
 
只看楼主 倒序阅读 楼主  发表于: 2010-09-14
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
1.    我想做个简单的例子,就是通过一个checkbox是否checked,来决定一个view上的Items是否可以用鼠标拖动,其实应该就是一个鼠标事件的重写问题,我不知道如何实现,想法是这样的,如果checkbox被选中了,那么我的view接收鼠标事件,如果没有选中,那么view不接受鼠标事件,也就是Items都不可以移动,代码实现,遇到点问题,我怎么取消view中的鼠标事件,现在的情况是一直可选……呃,接下去没辙了,呵呵
2.    第二个问题是,如果有一个graphics item,我想把它加到两个scene中去,我采取的办法是从一个scene中读取item的List,然后加到另一个scene中去,可是现在问题出现了,原来scene中的item都不见了,难道这个只支持添加到一个scene中去吗?
如果我想实现上述功能,应当怎么办呢?
还望各位不吝赐教,照例,我会将解决方案写出来

第一个问题可以使用楼下网友提出的setFlag的方法,由于现在我已经不想操作item层面上的东西,所以暂时使用setEnabled函数
第二个问题,我需要将一个特定类型的Item加到另一个scene中去(scene中不止一个类型的item),现在找到的办法是创建另一个相同的item,加到另一个scene中

--------------------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------
今天又搞出个问题
我想保存view下的items,我想只要写个文件,保存它们的坐标和一些属性,打开文件时再重新创建它们即可。
1.  我如何判断这个view里面的Items有没有变化(新增了item,或者view中的item坐标发生了改变,被人为移动了),因为我要靠这个是否变化来确定现在的文件是否需要更新,目前没想到什么思路。
2.  我在加载view的背景图片时,遇到一个问题,原本是800*600的图片,现在只显示部分,我想做个checkbox,让图片加载后,点击checkbox能够自适应窗口大小,我原本加载背景使用的是setBackgroundBrush(),但是现在需要自适应大小,就有点不知所措了
[ 此帖被davis45在2010-09-16 17:30重新编辑 ]
谢谢大家的指教
离线davis45
只看该作者 1楼 发表于: 2010-09-14
第一个问题,我找到一个比较……的解决方法,那就是setEnabled(false);这样做貌似也解决了问题,呵呵,期待达人更牛的解决方案,刚开始想用setMouseTracking();但是好像不可以,这个函数是追踪鼠标事件的,也没具体搞清楚,再看看
谢谢大家的指教
离线beaujolais
只看该作者 2楼 发表于: 2010-09-14
你说的这些功能一点都不麻烦啊,你写个QGraphicsItem模板,然后再继承一个QGraphicsView,在里面建立你的QGraphicsItem,想要多少就用多少。

然后直接重写QGraphicsItem的鼠标事件就可以了~~checked是有状态的,你做下检测嘛,如果checked鼠标事件就有效,否则不做任何处理。

附上一个我最近项目中用到的一个模板~~~
附件: myView.rar (5 K) 下载次数:29
离线sbtree
只看该作者 3楼 发表于: 2010-09-14
第一个问题,只要在checkBox改变的时候,对graphics item设置setFlag(QGraphicsItem::ItemIsMovable, checkBox->checked())就可以了
第二个问题,只能通过创建两个graphics item实例解决。另外一点,同一个scene的实例可以放到不同的View中,利用这个特点或许对你的问题能有所帮助
windows 7 + VC++2008 + Qt4.5.2
离线davis45
只看该作者 4楼 发表于: 2010-09-14
引用第3楼sbtree于2010-09-14 15:48发表的 :
第一个问题,只要在checkBox改变的时候,对graphics item设置setFlag(QGraphicsItem::ItemIsMovable, checkBox->checked())就可以了
第二个问题,只能通过创建两个graphics item实例解决。另外一点,同一个scene的实例可以放到不同的View中,利用这个特点或许对你的问题能有所帮助

对,第二个问题确实要建立两个相同的实例
第一个问题,我想尽量减少对item的操作,最好建立在view的层次上来做,所以没有动用setFlag
多谢指教
谢谢大家的指教
离线davis45
只看该作者 5楼 发表于: 2010-09-14
引用第2楼beaujolais于2010-09-14 15:35发表的 :
你说的这些功能一点都不麻烦啊,你写个QGraphicsItem模板,然后再继承一个QGraphicsView,在里面建立你的QGraphicsItem,想要多少就用多少。
然后直接重写QGraphicsItem的鼠标事件就可以了~~checked是有状态的,你做下检测嘛,如果checked鼠标事件就有效,否则不做任何处理。
附上一个我最近项目中用到的一个模板~~~

正在研读,多谢
谢谢大家的指教
离线davis45
只看该作者 6楼 发表于: 2010-09-14
引用第2楼beaujolais于2010-09-14 15:35发表的 :
你说的这些功能一点都不麻烦啊,你写个QGraphicsItem模板,然后再继承一个QGraphicsView,在里面建立你的QGraphicsItem,想要多少就用多少。
然后直接重写QGraphicsItem的鼠标事件就可以了~~checked是有状态的,你做下检测嘛,如果checked鼠标事件就有效,否则不做任何处理。
附上一个我最近项目中用到的一个模板~~~

您用的Qt版本是多少啊?里面加了一些我这里没有的函数,比如setViewportUpdateMode();
还有drawRoundedRect();
我这个版本下的是drawRoundRect();函数,不知道效果是否一样

这是我运行出来的效果图,好像是如果有鼠标移动事件,则有debug信息出现,窗口中会自动判断是否有鼠标进入从而改变窗口内的颜色
谢谢大家的指教
离线davis45
只看该作者 7楼 发表于: 2010-09-15
(新问题)
我记得有个函数是选取图片的大小,然后添加到一个矩形大小的区域的
可惜不记得是哪个里面的了
找到了QPixmap::scaled(),先试试
[ 此帖被davis45在2010-09-15 13:58重新编辑 ]
谢谢大家的指教
离线davis45
只看该作者 8楼 发表于: 2010-09-15
Re:(新问题)
引用第7楼davis45于2010-09-15 13:53发表的 (新问题) :
我记得有个函数是选取图片的大小,然后添加到一个矩形大小的区域的
可惜不记得是哪个里面的了
找到了QPixmap::scaled(),先试试


这个方法貌似不行,由于使用了QBrush吧,最后图片是被粉刷出来的一样,从中心点开始分了四个块儿

谢谢大家的指教
离线beaujolais
只看该作者 9楼 发表于: 2010-09-15
引用第6楼davis45于2010-09-14 16:10发表的 :
您用的Qt版本是多少啊?里面加了一些我这里没有的函数,比如setViewportUpdateMode();
还有drawRoundedRect();
我这个版本下的是drawRoundRect();函数,不知道效果是否一样
[图片]
.......


我用的4.7

不过你说的那两个函数setViewportUpdateMode(); drawRoundedRect(); 看文档从Qt4.3就有了

setViewportUpdateMode(); 是设置刷新模式
drawRoundedRect(); 是画圆角矩形

这个模板是想说写一个自己的QGraphicsItem模板,这样比较方便。

我就用这种方式用Qt重现了ipad的日历
离线beaujolais
只看该作者 10楼 发表于: 2010-09-15
Re:Re:(新问题)
引用第8楼davis45于2010-09-15 14:28发表的 Re:(新问题) :
这个方法貌似不行,由于使用了QBrush吧,最后图片是被粉刷出来的一样,从中心点开始分了四个块儿
[图片]



你是想在一个矩形区域内放一个图片么?

并让图片的大小与矩形区域一致?

那么这个如何?

void QPainter::drawPixmap ( const QRect & rectangle, constQPixmap & pixmap )
This is an overloaded function.
Draws the given pixmap into the given rectangle.
Note: The pixmap is scaled to fit the rectangle, if both the pixmap and rectangle size disagree.
离线davis45
只看该作者 11楼 发表于: 2010-09-15
Re:Re:Re:(新问题)
引用第10楼beaujolais于2010-09-15 16:03发表的 Re:Re:(新问题) :
你是想在一个矩形区域内放一个图片么?
并让图片的大小与矩形区域一致?
.......

  QPainter painter(this);//定义一个painter
  QSizeF viewSize = QSizeF(size());//获取当前的view大小
  QPixmap back_pixmap = QPixmap(picPath);//根据传过来的路径设置图片
  QSizeF pixSize = QSizeF(back_pixmap.size());//获取图片的大小
  painter.drawPixmap(QRectF(0,0,viewSize.width(),viewSize.height()),back_pixmap,QRectF(0,0,pixSize.width(),pixSize.height()));

  //draw图片
  drawBackground(&painter,QRectF(0,0,viewSize.width(),viewSize.height()));

  //使用QGraphicsView里面的函数draw背景;

可是……可能我写的不对吧,根本就么图像

谢谢大家的指教
离线davis45
只看该作者 12楼 发表于: 2010-09-16
解决新问题中的一个
引用楼主davis45 : 
  我在加载view的背景图片时,遇到一个问题,原本是800*600的图片,现在只显示部分,我想做个checkbox,让图片加载后,点击checkbox能够自适应窗口大小,我原本加载背景使用的是setBackgroundBrush(),但是现在需要自适应大小,就有点不知所措了
.......

这个问题通过一个QGraphicsPixmapItem(backgroundItem)解决的,以下是自适应view窗口的部分代码,将其作为背景图片使用即可:

   QSize mapViewSize = mapView->size();
   QPixmap pixmap = QPixmap(pixmapfileName).scaled(mapViewSize,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
   backgroundItem->setPixmap(pixmap);
   backgroundItem->setPos(QPoint(-mapViewSize.width()/2,-mapViewSize.height()/2));

谢谢大家的指教
快速回复
限100 字节
 
上一个 下一个