我正在尝试获取一个 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吗?
- 我怎样才能克服这种差异?(即通过手动获取差异并填充值或其他东西)
我在 Python 2.7.3 上使用 PySide 1.1.0 和 PyQt4 4.10.1 在 Linux 上。
提前感谢您的任何意见。
更新:
我尝试了PySide 提供的示例,它也有同样的问题;所以很可能我没有做错任何事。
另外,我检查了错误报告。它们有很多,没有一个通向任何地方。有些是为 Qt5 修复的,有些是被忽略的。