QPainter 调用 begin 时失败

问题描述 投票:0回答:2

我正在尝试在 QsplashScreen 上绘制 PNG 文件。 我正在尝试通过

QPainter
来做到这一点。我想通过
QPainter
这样做的原因是因为我希望它能够平滑地最小化(直到它消失),当我刚刚修复它时,它看起来一点也不平滑。

我将

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

我做错了什么?我应该如何启动

QPainter
的begin()?

c++ qt qpainter qpixmap
2个回答
5
投票

您想要创建

QSplashScreen
的子类并重新实现
drawContents

使用他们给你的油漆工,应该没问题。


0
投票

特别是关于使用

QPainter
begin
方法的文档明确指出,一次只能有一个画家在给定的绘画设备上处于活动状态,并且使用
QPainter
的构造函数版本会自动调用 begin 来您传入的值。因此,如果您按照问题中的描述进行操作,如下所示:

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
是如何工作的。您几乎应该始终使用将设备传递给构造函数的版本,并且永远不需要调用
begin
end
。 (有时,您可能会长时间保留画家,并特别在其上使用
begin
end
- 在这种情况下,您不应该将其初始化到设备。)

© www.soinside.com 2019 - 2024. All rights reserved.