今天尝试了一个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()));
问题解决。