找回密码
 立即注册
收起左侧

关于使用QPixmap放入的背景图片,如何放在所画图片的下层

7
回复
13302
查看
[复制链接]
累计签到:11 天
连续签到:1 天
来源: 2014-3-10 14:08:58 显示全部楼层 |阅读模式
5Qter豆
本帖最后由 qqyypig 于 2014-3-10 14:27 编辑

如题,在场景中已经画了很多矩形(a1,a2,a3),要求符合一定的条件,比如说,当滑动鼠标滚轮放大图片的时候,在a1,a2,a3这三个矩形的下面,画一个大的矩形AA,包住a1,a2,a3,再放一张背景图片填充AA,而我现在的代码运行之后,是把背景图片放在a1,a2,a3之上的,虽然已将背景色变透明,但这样不符合要求。setZValue(5)方法,只能是将AA的边框放到下层,没办法将QPixmap 图片做为背景放到a1 a2 a3之下,而这个CfsZjItem类,就是为了画矩形AA所写的类,代码如下:
  1. CfsZjItem::CfsZjItem(const QRectF &rect)
  2.     : CfsItem(rect)
  3. {
  4.     init();
  5. }

  6. /*!
  7. * \brief CfsZjItem::CfsZjItem
  8. * \param x
  9. * \param y
  10. * \param w
  11. * \param h
  12. */
  13. CfsZjItem::CfsZjItem(qreal x, qreal y, qreal w, qreal h)
  14.     : CfsItem(x, y, w, h)
  15. {
  16.     init();
  17. }

  18. /*!
  19. * \brief CfsZjItem::paint
  20. * \param painter
  21. * \param option
  22. * \param widget
  23. */
  24. void CfsZjItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  25. {
  26.     CfsItem::paint(painter, option, widget);

  27.     if(isNeedDisplayBgImage())
  28.     {
  29.         //painter->drawPixmap(rect().toRect(), getBgImage());
  30.         QPixmap pixmap = getBgImage();
  31.         painter->setOpacity(0.5);
  32.         painter->drawPixmap(rect(), pixmap, pixmap.rect());
  33.     }
  34. }

  35. /*!
  36. * \brief CfsZjItem::getBgImage
  37. * \return
  38. */
  39. QPixmap CfsZjItem::getBgImage()
  40. {
  41.     //return QPixmap("D:\\99_OTH\\81_Qt\\b4.jpg");
  42.     return QPixmap(":/img_blue/Config/img_blue/zjframe.png");
  43. }

  44. /*!
  45. * \brief CfsZjItem::isNeedDisplayBgImage
  46. * \return
  47. */
  48. bool CfsZjItem::isNeedDisplayBgImage()
  49. {
  50.     if(CfsView *view = cfsView())
  51.     {
  52.         return boundingRect().width() * view->transform().m11() > 20;
  53.     }

  54.     return false;
  55. }

  56. /*!
  57. * \brief CfsZjItem::init
  58. */
  59. void CfsZjItem::init()
  60. {
  61.     setPen(QPen(Qt::yellow, 0.0, Qt::DashDotDotLine));
  62.     setZValue(5);
  63.     setOpacity(0.9);
  64. }
复制代码
我是QT初学者,C++都不懂,之前一直做java,因为项目需要才刚刚开始学习,请教各位

最佳答案

查看完整内容

下面的是我写的一个 QPixmap pixMap(filename); QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(pixMap); pixmapItem->setZValue(0.5); scene->addItem(pixmapItem);
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-3-10 14:08:59 显示全部楼层
下面的是我写的一个
        QPixmap pixMap(filename);
        QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(pixMap);
        pixmapItem->setZValue(0.5);
        scene->addItem(pixmapItem);
回复

使用道具 举报

累计签到:1572 天
连续签到:1 天
2014-3-10 15:25:55 显示全部楼层
不是有现成的QGraphicsPixmapItem吗,可以直接显示图片的啊,为什么要写个这样的类呢
回复

使用道具 举报

累计签到:11 天
连续签到:1 天
2014-3-11 10:47:41 显示全部楼层
本帖最后由 qqyypig 于 2014-3-11 10:56 编辑
yafeilinux 发表于 2014-3-10 15:25
不是有现成的QGraphicsPixmapItem吗,可以直接显示图片的啊,为什么要写个这样的类呢 ...

建成这个类,主要还是和项目的业务有关,画图在场景里绘画几万个矩型作为图形项,并且再画不同的矩形将符合一定业务的矩形关联起来做边框等等,所以l领导要求每一个业务的矩形做一个CLASS类,因为每种矩形要向用户提供不同的接口,比如说,点击鼠标后符合某种业务的矩形要变成响应的颜色等等,这个类是继承了一个画图形项的类B,刚提到的向用户提供的接口是在类B提供的,然后类B最终继承的是QGraphicsRectItem,显示图片功能的话只是一小块

至于你刚才说的直接显示图片的问题,现在目前已经可以达到在多个矩形上面显示这张图片,但是项目要求的是,这张图片是动态的,不是一上来就显示的,而是符合某种条件,比如说几万的矩型在场景放大时,这张图片才被动态显示出来

目前这个功能也是做到了,但是问题的关键是,在个图片总是显示在多个矩形项的上面,这样就覆盖了矩形项原本的颜色,虽然我也是把这张图片显示了透明色,但是这并不符合要求

所以有什么办法,能使这张图片放在我画的几万个矩形的下层做为背景吗?

回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-3-11 16:02:44 显示全部楼层
qqyypig 发表于 2014-3-11 10:47
建成这个类,主要还是和项目的业务有关,画图在场景里绘画几万个矩型作为图形项,并且再画不同的矩形将符 ...

item有一个setzvalue函数,越大越在上面。
回复

使用道具 举报

累计签到:11 天
连续签到:1 天
2014-3-11 16:13:08 显示全部楼层
Syylc120317 发表于 2014-3-11 16:02
item有一个setzvalue函数,越大越在上面。

看第69行代码setZValue(5);我用过了,只能让黄色的矩形轮廓边框放在下层,没办法把图片也放在下层啊
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-3-11 20:17:45 显示全部楼层
qqyypig 发表于 2014-3-11 16:13
看第69行代码setZValue(5);我用过了,只能让黄色的矩形轮廓边框放在下层,没办法把图片也放在下层啊 ...

有个QgraphicsPixmapItem类,你把图片做成一个item就可以了
回复

使用道具 举报

累计签到:11 天
连续签到:1 天
2014-3-12 11:00:51 显示全部楼层
Syylc120317 发表于 2014-3-11 20:17
有个QgraphicsPixmapItem类,你把图片做成一个item就可以了

首先先谢谢你提供这样的方案,只是由于我是初学QT再加上不懂C++所以有些疑问可能比较低级,不要见笑
1、你说的是让我再写一个itemImage类,然后继承QgraphicsPixmapItem,在itemImage初期化里设置setzvalue放到下层,然后在itemImage里重写paint纯虚函数,paint里面做上面代码33-35行的事情吗?
2、在CfsZjItem类里30行if(isNeedDisplayBgImage())是否显示图片的判断条件里,new一个上面写的itemImage类嘛?
3、继承QgraphicsPixmapItem类到底有什么作用呢?需要用到这个类的哪些函数呢?和可以具体帮我讲讲吗?使用上和 painter->drawPixmap有什么不同吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了