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吗?
  • 我怎样才能克服这种差异?(即通过手动获取差异并填充值或其他东西)

我在 Python 2.7.3 上使用 PySide 1.1.0 和 PyQt4 4.10.1 在 Linux 上。

提前感谢您的任何意见。

更新

我尝试了PySide 提供的示例,它也有同样的问题;所以很可能我没有做错任何事。

另外,我检查了错误报告。它们有很多,没有一个通向任何地方。有些是为 Qt5 修复的,有些是被忽略的。

4

1 回答 1

0

我试过你的一段代码。它可以完美运行并返回正确的打印机和页面设置。在 win xp、PySide 1.1.2 和 python 3.3.2 上。这可能是您的 qt 库或某些操作系统配置错误的问题。

于 2013-06-04T10:54:00.037 回答