2010-01-20 75 views
0

我想在QsplashScreen上绘制一个PNG文件。我试图通过QPainter来做到这一点。我想通过QPainter这样做的原因是因为我希望它能够平滑地最小化(直到它消失),当我刚刚修理它时,它看起来并不平坦。调用开始时QPainter失败

我将QSplashScreen传递给QPainter构造函数。当我调用QPainter中的begin(),并以QSplashScreen作为参数时,它在断言d->active上失败。当我提供Qpixmap时,它会以同样的方式发生。

我在做什么错?我应该如何启动QPainter的begin()?

回答

5

您想要创建QSplashScreen的子类并重新实现drawContents。请参阅docs

使用他们给你的画家,你应该没问题。

+0

谢谢,它的确帮助我和我我的平稳过渡。 我还有一个问题。由于某种原因,原始图片仍然存在。会发生什么情况是我首先显示全尺寸图片,然后平滑地将其最小化。问题是,当照片被最小化时,原始的全尺寸照片仍然保留在背景中。 我试图setVisible(false)的第一幅画,它并没有帮助... 任何想法? 非常感谢。 – user254974 2010-01-24 09:37:00

+0

如果没有真正看到它,请尝试使用backgroundMode(http://doc.trolltech.com/4.6/qpainter.html#backgroundMode)和eraseRect(http://doc.trolltech.com/4.6/qpainter.html#eraseRect) – 2010-01-24 13:58:22

0

具体地说关于使用QPainter,对于begin方法的文档清楚说明只有一个画家可以在同一时间是活动的一个给定的涂料设备上,并且还,使用的QPainter构造版本自动调用开始为值你传入所以,如果你正在做它作为你的问题描述,就像这样:

QWidget *widget(...); 

QPainter painter(widget); 
painter.begin(widget); // <-- error, we already have a painter active on that paint device (our own). 
// Do stuff... 
painter.end(); 

这可能是因为Qt的应先关闭装置,然后打开新的,但像上面这样的代码意味着你不完全不了解QPainter的工作原理。您应该几乎总是使用将设备传递给构造函数的版本,并且永远不需要致电beginend。 (有时候,你可能会保持画家很长一段时间,特别是使用beginend就可以了 - 在这种情况下,你不应该初始化它到设备上。)

+0

我不同意最后一部分。如果你刚刚开始,你应该总是使用提供给你的QPainter重写绘画或绘制事件。但无论如何,你应该阅读你使用的函数的文档。 – 2010-01-20 20:08:08