ユーザーが印刷のすべてのオプションを選択できるように、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 用に修正され、一部は無視されます。