【问题标题】:Using QPainter with QPaintDevice multiple times多次使用 QPainter 和 QPaintDevice
【发布时间】:2014-12-31 10:05:40
【问题描述】:

我们都知道这个警告来自

bool QPainter::​begin(QPaintDevice * device)   

警告:绘画设备一次只能由一名画家绘画。

http://doc.qt.io/qt-5/qpainter.html#begin

但是如果我有两个对象共享一个像素图,而一个对象 Bar 包含另一个对象 Foo。

class Foo
{
public:
    QPixmap* barPixmap;
    void draw()
    {
         QPainter painter(barPixmap);
         painter.drawText(0,0,"FooText");
    }

}

class Bar
{
public:
    QPixmap* barPixmap;
    Foo*     fooObject;
}

我得到了类似的东西

Bar::paintEvent(QPaintEvent* )
{
    QPainter painter(barPixmap);
    painter.drawText(50,50,"BarText");
    fooObject->draw();

}

是多图吗?编译器什么也没抛出,而且代码似乎工作正常。

【问题讨论】:

  • 它工作但它看起来像 fooObject->draw();对 barPixmap 什么都不做

标签: qt qpainter


【解决方案1】:

警告告诉您一次创建多个QPainters。由于所有绘画事件都在主线程中处理,因此它们会被处理。只要QPainter 对象在事件处理程序结束时被销毁,就不会出现警告。在一台设备上进行多次后续绘画很好。

但是架构是有问题的。例如,如果以这种方式绘制多个小部件,其中一个小部件将显示旧版本的像素图,而第二个小部件将显示更新版本。这种不一致可能是一个问题。将任何逻辑放入绘制事件处理程序中通常是没有意义的(有时是有害的)。当可用数据发生变化时,您应该更改像素图并在绘制事件中绘制它。

【讨论】:

  • 当然,架构是有问题的。我正在移植 1994 年的非常旧的代码,我必须按原样保存架构。
猜你喜欢
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多