3

ユーザーが印刷のすべてのオプションを選択できるように、PrinterDialog を取得しようとしています。

PySideでこれを試してみると、ユーザーがダイアログでどのような変更を加えても、返されるプリンターは常に同じです(デフォルトだと思います)。最初にプリンターを渡すときにも同じことが起こります。

私が話していることを確認するために、この小さな自己完結型の例を考え出しました。

USE_PYQT4 = True

if USE_PYQT4:
    from PyQt4 import QtGui, QtCore
else:
    from PySide import QtGui, QtCore

import sys

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.printBtn = QtGui.QPushButton("Print Preview")
        self.printBtn.clicked.connect(self.onPrint)

        # Will store the QPrinter instance
        self.printer = None
        # Will store the QPrintDialog, because it
        # might get garbage-collected, and the QPrinter with it
        self.pdialog = None

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.printBtn)

        self.setLayout(layout)

    def printState(self):
        print '*'*20
        if self.printer is None:
            print '-- no printer -- '
        else:
            print 'printer name', self.printer.printerName()
            print 'page size', self.printer.pageSize()
            print 'paper size', self.printer.paperSize()
        print
        print

    def askPrinter(self):
        # Either like this:
        # 
        # self.printer = QtGui.QPrinter()
        # self.pdialog = dialog = QtGui.QPrintDialog(self.printer)

        # Or like that:
        # 
        self.pdialog = dialog = QtGui.QPrintDialog()

        dialog.setOption(QtGui.QAbstractPrintDialog.PrintCollateCopies, True)
        dialog.setOption(QtGui.QAbstractPrintDialog.PrintCurrentPage, True)
        dialog.setOption(QtGui.QAbstractPrintDialog.PrintPageRange, True)
        dialog.setOption(QtGui.QAbstractPrintDialog.PrintSelection, True)
        dialog.setOption(QtGui.QAbstractPrintDialog.PrintShowPageSize, True)
        dialog.setOption(QtGui.QAbstractPrintDialog.PrintToFile, True)

        print 'before PrintDialog'
        self.printState()

        if dialog.exec_() != QtGui.QDialog.Accepted:
            return False

        # And that, if not set before
        self.printer = dialog.printer()

        print 'after PrintDialog'
        self.printState()

        return True

    def onPrint(self):
        if not self.askPrinter():
            print 'oops'
            return

        self.preview()

    def preview(self):
        dialog = QtGui.QPrintPreviewDialog(self.printer)
        dialog.paintRequested.connect(self.handlePaintRequest)
        dialog.exec_()

    def handlePaintRequest(self, printer):
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.insertText("""
        SOME TEXT
        """)
        cursor.insertText("-"*20)

        data = [('Line {}'.format(i), '{} times'.format(i*2)) for i in xrange(20)]

        table = cursor.insertTable(len(data), max(len(d) for d in data))        
        for row in range(table.rows()):
            for column in range(table.columns()):
                cursor.insertText(unicode(data[row][column]))
                cursor.movePosition(QtGui.QTextCursor.NextCell)

        cursor.movePosition(QtGui.QTextCursor.NextBlock)

        cursor.insertText("-"*20)
        cursor.insertText("""
        And that's it
        """)

        doc.print_(printer)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    app.window = Window()
    app.window.show()

    sys.exit(app.exec_())

PyQt4 を使用する場合、問題は異なることに注意してください。

PySide では、ページ サイズが手動で設定されていない場合は、かかりますA4(最初のプリンターのデフォルトである可能性があります)。また、から設定されたオプションはsetOption無視されるようです...

PyQt4 では、0ページ サイズ ダイアログが開かれない限り、ページ サイズは に設定されます。ページ サイズが0の場合、ページ サイズ ダイアログを開いた場合とは明らかに異なります。また、ここではページ余白が 0 に設定されています。ただし、オプションは尊重され、正しいデフォルト値 (CUPS 管理ページで設定) が使用されます。

奇妙なのは、Kate の印刷ダイアログを確認したところ、完全に正しいことです。Kate は C++ の Qt アプリケーションです。ただし、C ++で自分でテストすることはできませんでした。

  • これは QPrintDialog を作成する正しい方法ですか、それとも何か間違っていますか?
  • なぜそんなに違いがあるのですか?最終的にはすべて Qt に委譲すべきではないでしょうか?
  • この違いをどのように克服できますか?(つまり、手動で違いを取り、値などを埋めることによって)

LinuxでPySide 1.1.0とPyQt4 4.10.1を使用してPython 2.7.3を使用しています。

ご意見をお寄せいただきありがとうございます。

更新

PySide で提供されているを試してみましたが、同じ問題があります。だからおそらく私は何も悪いことをしていません。

また、バグレポートを確認しました。それらはたくさんありますが、どれもどこにもつながりません。一部は Qt5 用に修正され、一部は無視されます。

4

1 に答える 1