Как предотвратить закрытие 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):, но решение было вообще без кода (пройти).

Другие вопросы по тегам