2013-09-25 2 views
3

Я пытаюсь напечатать виджет в PyQt, но получаю сообщение об ошибке «QPaintDevice: Невозможно уничтожить окрашенное устройство, которое окрашивается». Я думаю, проблема в том, что мой метод заканчивается, и поэтому qPaintDevice уничтожается, прежде чем художник закончит рисовать pixmap. Однако я не знаю, как замедлить работу художника.Ошибка печати изображения в PyQt

Код для моего метода здесь:

def printer(self): 
    "Prints the current diagram" 
    # Create the printer 
    printerobject = QtGui.QPrinter(0) 
    # Set the settings 
    printdialog = QtGui.QPrintDialog(printerobject) 
    if printdialog.exec_() == QtGui.QDialog.Accepted: 
     # Print 
     pixmapImage = QtGui.QPixmap.grabWidget(self.contentswidget) 
     painter = QtGui.QPainter(printerobject) 
     painter.drawPixmap(0, 0, pixmapImage) 

Для чего это стоит, я попытался с помощью .begin() и подход .end(), но безрезультатно.

ответ

6

Я выяснил свою проблему - я забыл удалить художника, что в ретроспективе кажется очевидным (разве это не всегда?). Добавление «del painter» в конец делает работу кода. Вот рабочий код:

def printer(self): 
    "Prints the current diagram" 
    # Create the printer 
    printerobject = QtGui.QPrinter(0) 
    # Set the settings 
    printdialog = QtGui.QPrintDialog(printerobject) 
    if printdialog.exec_() == QtGui.QDialog.Accepted: 
     # Print 
     pixmapImage = QtGui.QPixmap.grabWidget(self.contentswidget) 
     painter = QtGui.QPainter(printerobject) 
     painter.drawPixmap(0, 0, pixmapImage) 
     del painter 
+1

Необходимо добавить 'del painter' * не * очевидно, так как это не Pythonic. Спасибо, что узнал об этом, у меня была та же проблема. – EvertW

+0

Обычно сборщик мусора python должен позаботиться об этом. Должно быть какое-то состояние гонки .. – pixelbrei

+3

вместо использования 'del painter' вы должны вместо этого использовать' painter.end() ' – swinman

Смежные вопросы