Как предотвратить закрытие QPrintPreviewDialog кнопкой печати после печати
Когда я запускаю эту простую программу ...
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
html = "<html><body>"
for i in range(1000):
html += "<p>{i}</p>".format(i=i)
html += "</body></html>"
self.document = QTextDocument()
self.document.setHtml(html)
closing_checkbox = QCheckBox("Close Print Preview dialog after first print")
closing_checkbox.setCheckState(Qt.Checked)
button_preview = QPushButton('Preview', self)
button_preview.clicked.connect(self.handlePreview)
layout = QVBoxLayout(self)
layout.addWidget(closing_checkbox)
layout.addWidget(button_preview)
def handlePreview(self):
dialog = QPrintPreviewDialog()
dialog.paintRequested.connect(self.document.print_)
dialog.exec_()
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
... после нажатия кнопки предварительного просмотра открывается QPrintPreviewDialog. После нажатия (крайняя справа) кнопки «Печать» на панели инструментов я выбираю принтер, и он печатает, и QPrintPreviewDialog закрывается. Я понимаю, что в большинстве случаев это именно то, чего хочет пользователь. Но что, если в некоторых случаях пользователь захочет снова распечатать тот же документ, но на другом сетевом принтере. Или, например, он хочет сначала напечатать страницы 1-2, а после этого (с тем же QPrintPreviewDialog все еще открытым) он хочет напечатать страницы 9-10.
Когда я снимаю закрывающий флажок, я хочу, чтобы QPrintPreviewDialog не закрывался после нажатия кнопки «Печать». Хотелось это сделать? Я пробовал создать подкласс QPrintPreviewDialog и реализовать accept (), reject (), closeEvent (), но безуспешно.
2 ответа
Одно из возможных решений - переопределить
accept()
метод:
class PrintPreviewDialog(QPrintPreviewDialog):
def accept(self):
pass
dialog = PrintPreviewDialog()
Решение от eyllanesc работает. Вот модифицированный код, основанный на его решении:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
class PrintPreviewDialog(QPrintPreviewDialog):
def __init__(self, close_after_print=True):
super(PrintPreviewDialog, self).__init__()
self.close_after_print = close_after_print
def accept(self):
if self.close_after_print:
super(PrintPreviewDialog, self).accept()
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
html = "<html><body>"
for i in range(1000):
html += "<p>{i}</p>".format(i=i)
html += "</body></html>"
self.document = QTextDocument()
self.document.setHtml(html)
self.closing_checkbox = QCheckBox("Close Print Preview dialog after first print")
self.closing_checkbox.setCheckState(Qt.Checked)
button_preview = QPushButton('Preview', self)
button_preview.clicked.connect(self.handlePreview)
layout = QVBoxLayout(self)
layout.addWidget(self.closing_checkbox)
layout.addWidget(button_preview)
def handlePreview(self):
dialog = PrintPreviewDialog(self.closing_checkbox.isChecked())
dialog.paintRequested.connect(self.document.print_)
dialog.exec_()
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Моя проблема заключалась в том, что я пробовал всевозможные коды в
def accept(self):
, но решение было вообще без кода (пройти).