Qt QGraphicsScene绘制背景图片,并解决item移动破坏背景问题。

今天尝试了一个Qt的QGraphics框架,框架的概念如下:

 具体的框架介绍不是本文的重点,就不多介绍,本文要解决的问题是在scene上绘制背景图片,并解决item移动破坏背景的问题。

毕竟scene单纯一个

this->sce->setBackgroundBrush(QColor(240,240,240));

设置背景颜色实在太过单调。

 记录的思路如下:

今天主要成功设置了开机动画的背景。如何设置背景?从view,scene,item模型可以看出,背景应该在scene设置,百度了一下发现scene的drawbackground可以实现,但是这个函数不能直接调用。于是写了一个myScene类继承于QGraphicScene,重写drawbackground函数。

void MyScene::drawBackground(QPainter *painter, const QRectF &rect)
{
    QPixmap pm("../image/sce1.jpeg");
    painter->drawPixmap(rect,pm,QRect());
}

但是问题并没有就此解决,图片确实是显示出来了,但是在item移动的时候,背景会被破坏,就是背景被图片拖着走,就跟塑料融化的感觉一样。上网百度未果。

思考了一下,解决这个问题的方案其实还挺多。既然背景被破坏了,那我们只需要update一下应该就可以了。问题现在变成了选择题:是在advance里面update,还是在view上面update?当然,调用的都是scene 的update。问题是不确定scene 的槽函数advance是否能被重写,F1查看advance介绍,并没有virture修饰。

所以保险起见选择在view上面调用update。考虑到item的移动是通过timer来实现的,所以只需要在timeout的时候再连接一个scene的槽函数即可。

问题又来了,update的参数列表是update(RectF),即重绘的区域,而SIGNAL(timeout())则不带任何参数。所以要么给timer写一个新的信号,要么给scene写一个新的槽。但在这个情况下,如果选择前者,还要再写一个槽函数监听timerout和发送newtimeout(RectF)信号,而选择后者的话,由于我已经继承了一个新类myScene,所以在myScen里面写一个新的槽最为便捷。

void MyScene::myUpdate()
{
    this->update(0,0,this->width(),this->height());
}
connect(myTimer,SIGNAL(timeout()),this->sce,SLOT(advance()));
connect(myTimer,SIGNAL(timeout()),this->sce,SLOT(myUpdate()));

 

 问题解决。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
可以使用 `QGraphicsItem` 类来绘制一个圆和一条线作为一个 item。下面是一个示例代码: ```cpp #include <QGraphicsItem> #include <QPainter> class MyItem : public QGraphicsItem { public: MyItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) { setFlag(ItemIsMovable); // 设置可以拖动 } QRectF boundingRect() const override { return QRectF(-50, -50, 100, 100); // 返回 item 的边界矩形 } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { Q_UNUSED(option); Q_UNUSED(widget); painter->setRenderHint(QPainter::Antialiasing, true); // 抗锯齿 painter->setPen(QPen(Qt::black, 2)); // 设置画笔颜色和宽度 painter->drawEllipse(-50, -50, 100, 100); // 绘制圆 painter->drawLine(-50, 0, 50, 0); // 绘制线 } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QGraphicsScene scene; QGraphicsView view(&scene); MyItem *item = new MyItem; scene.addItem(item); view.show(); return a.exec(); } ``` 在 `MyItem` 类中,我们重写了 `boundingRect()` 和 `paint()` 函数。`boundingRect()` 函数返回 item 的边界矩形,用于确定 item 的位置和大小。`paint()` 函数用于绘制 item 的图形。 在 `paint()` 函数中,我们先设置了一些画笔和渲染参数,然后使用 `drawEllipse()` 函数绘制了一个圆,使用 `drawLine()` 函数绘制了一条线。这两个函数的参数分别为左上角坐标和宽度、高度(圆的参数)或者起点和终点坐标(线的参数)。最后,我们将 item 添加到场景中,然后显示场景视图。 这个示例中的 item 可以被拖动,因为我们在构造函数中调用了 `setFlag(ItemIsMovable)` 函数,这个函数设置了一个标志位,表示该 item 可以被移动
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿峰不想搬砖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值