【问题标题】:QPainter fails when calling begin调用开始时QPainter失败
【发布时间】:2010-01-20 14:50:31
【问题描述】:

我正在尝试在 QsplashScreen 上绘制 PNG 文件。 我试图通过QPainter 来做这件事。我想通过QPainter 这样做的原因是因为我希望它平滑地最小化(直到它消失),当我只是修复它时它看起来一点也不平滑。

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

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

【问题讨论】:

    标签: c++ qt qpainter qpixmap


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,它确实帮助了我,我顺利过渡了。我还有一个问题。不知为何,原来的画面还放在那里。发生的情况是,我首先显示全尺寸图片,然后平滑地最小化它。问题是当图片被最小化时,原始的全尺寸图片仍然保留在背景中。我尝试为第一幅画设置可见(假),但没有帮助......有什么想法吗?非常感谢。
    • 在没有实际看到的情况下,尝试使用 backgroundMode (doc.trolltech.com/4.6/qpainter.html#backgroundMode) 和 eraseRect (doc.trolltech.com/4.6/qpainter.html#eraseRect)
    【解决方案2】:

    特别是关于使用QPainterbegin 方法的文档明确指出,一次只能在给定的绘图设备上激活一个画家,并且使用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。 (有时,您可能会长时间使用painter,并专门在其上使用beginend——在这种情况下,您不应该将其初始化为设备。)

    【讨论】:

    • 我不同意最后一部分。如果您刚刚开始,您应该始终使用提供给您的 QPainter 覆盖绘制或绘制事件。但无论哪种方式,您都应该阅读您使用的函数的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2022-06-15
    • 1970-01-01
    • 2019-03-31
    • 2021-06-16
    相关资源
    最近更新 更多