QPainter не является наследником QObject?
Подскажите пожалуйста, почему код
from PyQt5 import QtGui
from PyQt5 import QtCore
isinstance(QtGui.QPainter(), QtCore.QObject)
возвращает False? Разве QPainter не является наследником QObject?
Если же он всё же является, то почему я не могу вызвать метод deleteLater() класса QObject?
Более подробно о том, почему меня это интересует. Вот кусок слота, который завершается ошибкой:
QWin32PrintEngine::newPage: EndPage failed (Неверный дескриптор.)
QPaintDevice: Cannot destroy paint device that is being painted
printer = QPrinter(QPrinter.HighResolution)
dialog = QPrintDialog(printer, view)
if dialog.exec_() != QtWidgets.QDialog.Accepted:
return
loop = QtCore.QEventLoop()
result = False
def print_preview(success):
nonlocal result
result = success
loop.quit()
progressbar = QtWidgets.QProgressDialog(view)
progressbar.setWindowTitle("Печать")
progressbar.findChild(QtWidgets.QProgressBar).setTextVisible(False)
progressbar.setLabelText("Подождите. Идёт отправка файла на печать...")
progressbar.setRange(0, 0)
progressbar.show()
progressbar.canceled.connect(loop.quit)
page = view.page()
page.print(printer, print_preview)
loop.exec_()
progressbar.close()
if not result:
title = "Ошибка"
text = "Ошибка печати."
icon = QtWidgets.QMessageBox.Critical
create_messagebox(title, text, icon)
Ошибка вылетает при испускании сигнала cancel в progressbar. Т.е. QPainter, находящийся внутри QPrinter начинает рисовать, но при нажатии кнопки cancel, происходит выход из слота и QPainter не может удалиться. Я прочитал на форумах, что для этого нужно вызвать метод deleteLater() класса QObject, однако, QPainter не может вызвать метод из класса QObject.
РЕШЕНИЕ МОЕЙ ПРОБЛЕМЫ:
Создать класс обёртку PrinterHandler и реализовать внутри него метод (слот) def cancel(self):, который будет учитывать сценарий работы с принтером Microsoft XPS Document Writer.
class PrinterHandler(object):
def __init__(self):
self.loop = QtCore.QEventLoop()
self.printer = QPrinter(QPrinter.HighResolution)
self.result = False
def cancel(self):
xpsStr = "Microsoft XPS Document Writer"
if self.printer.printerName() == xpsStr and not self.result:
title = "Внимание"
text = "Выбран принтер Microsoft XPS Document Writer. Отменить печать невозможно."
icon = QtWidgets.QMessageBox.Critical
create_messagebox(title, text, icon)
return
self.loop.quit()
printerHandler = PrinterHandler()
dialog = QPrintDialog(printerHandler.printer, view)
if dialog.exec_() != QtWidgets.QDialog.Accepted:
return
result = False
def print_preview(success):
nonlocal result
result = success
printerHandler.loop.quit()
progressbar = QtWidgets.QProgressDialog(view)
progressbar.setWindowTitle("Печать")
progressbar.findChild(QtWidgets.QProgressBar).setTextVisible(False)
progressbar.setLabelText("Подождите. Идёт отправка файла на печать...")
progressbar.setRange(0, 0)
progressbar.show()
progressbar.canceled.connect(printerHandler.cancel)
page = view.page()
page.print(printerHandler.printer, print_preview)
printerHandler.loop.exec_()
if not result:
# NEED TO: progressbar закрывается?
title = "Ошибка"
text = "Ошибка печати."
icon = QtWidgets.QMessageBox.Critical
create_messagebox(title, text, icon)
else:
printerHandler.result = True
progressbar.close()
title = "Печать"
text = "Файл отправлен на печать."
icon = QtWidgets.QMessageBox.Information
create_messagebox(title, text, icon)
Ответы (1 шт):
Класс QPainter выполняет низкоуровневую отрисовку виджетов и других устройств рисования
и не наследуется от QObject.
Что наследуется от QObject -> https://doc.qt.io/qt-5/qobject.html
А вот например QtWidgets.QWidget наследуется от QObject


