Python PySide2引发错误,“QPaint设备:无法销毁正在绘制的绘制设备”

Python PySide2引发错误,“QPaint设备:无法销毁正在绘制的绘制设备”,python,pyside2,Python,Pyside2,我试图在QPixmap上绘制一些东西,但在清理过程中它抛出了一个错误 from PySide2.QtGui import QPixmap, QPainter from PySide2.QtWidgets import QApplication app = QApplication() width = 200 height = 100 pixmap = QPixmap(width, height) painter = QPainter(pixmap) painter.drawLine(0, 0,

我试图在QPixmap上绘制一些东西,但在清理过程中它抛出了一个错误

from PySide2.QtGui import QPixmap, QPainter
from PySide2.QtWidgets import QApplication

app = QApplication()
width = 200
height = 100
pixmap = QPixmap(width, height)
painter = QPainter(pixmap)
painter.drawLine(0, 0, 100, 100)
print('Done.')
当我运行它时,我看到“完成”消息,然后是一个错误

Done.
QPaintDevice: Cannot destroy paint device that is being painted

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

我看到过一些类似的问题,都有相同的错误,但不清楚是什么原因导致了错误,也不清楚如何避免错误。

经过实验后,似乎画家必须在pixmap出现之前进行清理,否则就会出现错误。例如,这样做不会出错

from PySide2.QtGui import QPixmap, QPainter
from PySide2.QtWidgets import QApplication

app = QApplication()
width = 200
height = 100
pixmap = QPixmap(width, height)
painter = QPainter(pixmap)
painter.drawLine(0, 0, 100, 100)
print('Done.')

del painter
del pixmap
你也可以告诉画家在不破坏它的情况下进行清理。打电话给end告诉他你已经画好了

由于神秘的原因,还有其他一些东西可以避免错误。例如,这样可以避免错误

from PySide2.QtGui import QPixmap, QPainter
from PySide2.QtWidgets import QApplication

app = QApplication()
width = 200
height = 100
pixmap = QPixmap(width, height)
painter = QPainter(pixmap)
painter.device()  # <-- No idea why this helps!
painter.drawLine(0, 0, 100, 100)
print('Done.')
总之,只需确保画师在pixmap之前清理干净即可。我建议要么在比pixmap更小的范围内使用painter,要么显式调用painter.end

from PySide2.QtGui import QPixmap, QPainter
from PySide2.QtWidgets import QApplication

app = QApplication()
width = 200
height = 100
pixmap = QPixmap(width, height)
painter = QPainter(pixmap)
painter.device()  # <-- No idea why this helps!
painter.drawLine(0, 0, 100, 100)
print('Done.')