Qt 多次将QPaint与QPaint设备一起使用

Qt 多次将QPaint与QPaint设备一起使用,qt,qpainter,Qt,Qpainter,我们都知道这个警告 bool QPainter::​begin(QPaintDevice * device) 警告:一个喷漆设备一次只能由一名油漆工喷漆 但如果两个对象共享一个pixmap,而一个对象栏包含另一个对象Foo呢 class Foo { public: QPixmap* barPixmap; void draw() { QPainter painter(barPixmap); painter.drawText(0,

我们都知道这个警告

bool QPainter::​begin(QPaintDevice * device)   
警告:一个喷漆设备一次只能由一名油漆工喷漆

但如果两个对象共享一个pixmap,而一个对象栏包含另一个对象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();

}

是多重绘图吗?编译器不会抛出任何内容,代码似乎正常工作。

警告告诉您如何一次创建多个
QPainter
s。由于所有绘制事件都是在主线程中处理的,因此会对它们进行相应的处理。只要
qPaint
对象在事件处理程序的末尾被销毁,警告就不会出现。在一台设备上进行多幅后续绘画是可以的


然而,架构是有问题的。例如,如果以这种方式绘制多个小部件,其中一个小部件将显示旧版本的pixmap,而第二个小部件将显示更新的版本。这种不一致性可能是一个问题。在绘制事件处理程序中放置任何逻辑通常是毫无意义的(有时是有害的)。当可用数据更改时,您应该更改pixmap,只需在paint事件中绘制它。

它可以工作,但看起来像fooObject->draw();不要使用barPixmapSure,架构是有问题的。我正在移植1994年的老代码,我必须保存体系结构。