QGraphicsView 实现动画实验

在做桌面雪花飘落效果的动画时, 想用QGraphicsView来实现动画, 这里做了个实验.

本实验是在scene里添加100个item, 实现简单的斜线运动, 碰到边缘后反弹的效果. 主要是测试其消耗资源情况.

实验结果: 高CPU运行!

下面是代码主要代码:

窗口构造函数, 主要是布局, 创建QGraphicsView和QGraphicsScene对象, 添加100个items

Widget::Widget(QWidget *parent) :
	QWidget(parent),
	ui(new Ui::Widget)
{
	ui->setupUi(this);
	this->setMinimumSize(800, 600);
	pixmap.load(":/blueBall.png");
	if(pixmap.isNull())
	{
		qDebug()<<"not found image: ':/blueBall.png'";
		qApp->quit();
	}

	scene = new QGraphicsScene(this);
	scene->setBackgroundBrush(QBrush(Qt::gray));
	scene->setSceneRect(-400, -300, 800, 600);

	for(int i = 0; i < 100; i++)
	{
		item = new ImageItem(&pixmap);
		item->setPos(i, i);
		scene->addItem(item);
	}

	view = new QGraphicsView(this);
	view->setScene(scene);
	QHBoxLayout *layout = new QHBoxLayout(this);
	layout->addWidget(view);
	setLayout(layout);
}

ImageItem继承了QGraphicsItem, 并使用timer实现运动的小球:

ImageItem::ImageItem(QPixmap *pixmap)
{
	Pixmap = pixmap;
	startTimer(100);
}

QRectF ImageItem::boundingRect() const
{
	return QRectF(-Pixmap->width()/2, -Pixmap->height()/2, Pixmap->width(), Pixmap->height());
}

void ImageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
	painter->drawPixmap(boundingRect().topLeft(), *Pixmap);
}

void ImageItem::timerEvent(QTimerEvent *e)
{
	static qreal x = 5, y = 5;
	QPointF ps = pos();
	//qDebug()<<"pos: "<<ps;
	if(ps.x() + boundingRect().left() < scene()->sceneRect().left()) x = 5;
	if(ps.x() + boundingRect().right() > scene()->sceneRect().right()) x = -5;
	if(ps.y() + boundingRect().top() < scene()->sceneRect().top()) y = 5;
	if(ps.y() + boundingRect().bottom() > scene()->sceneRect().bottom()) y = -5;

	setPos(mapToScene(x, y));
	update();
}

对于这种重画背景实现的动画, 如果有什么高见, 欢迎留言.
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页