【问题标题】:How to print with landscape orientation in PyQt5?如何在 PyQt5 中横向打印?
【发布时间】:2019-02-08 20:59:55
【问题描述】:

如何修改此代码以自动打印,或将默认设置设置为横向?

我是 PyQt5 的新手。尝试制作具有打印功能的应用程序。我从互联网上复制并粘贴了这段代码,但它的默认设置是纵向。自动横向打印很重要。

from PyQt5 import QtWidgets, QtCore, QtPrintSupport, QtGui

class Window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle(self.tr('Document Printer'))
        self.table = QtWidgets.QTableWidget(200, 5, self)

        for row in range(self.table.rowCount()):
            for col in range(self.table.columnCount()):
                item = QtWidgets.QTableWidgetItem('(%d, %d)' % (row, col))
                item.setTextAlignment(QtCore.Qt.AlignCenter)
                self.table.setItem(row, col, item)
        self.table.setHorizontalHeaderLabels(
            'SKU #|NAME|DESCRIPTION|QUANTITY|PRICE'.split('|'))
        self.buttonPrint = QtWidgets.QPushButton('Print', self)
        self.buttonPrint.clicked.connect(self.handlePrint)
        self.buttonPreview = QtWidgets.QPushButton('Preview', self)
        self.buttonPreview.clicked.connect(self.handlePreview)
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.table, 0, 0, 1, 2)
        layout.addWidget(self.buttonPrint, 1, 0)
        layout.addWidget(self.buttonPreview, 1, 1)

    def handlePrint(self):
        dialog = QtPrintSupport.QPrintDialog()
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            self.handlePaintRequest(dialog.printer())

    def handlePreview(self):
        dialog = QtPrintSupport.QPrintPreviewDialog()
        dialog.paintRequested.connect(self.handlePaintRequest)

        dialog.exec_()

    def handlePaintRequest(self, printer):
        document = self.makeTableDocument()
        document.print_(printer)

    def makeTableDocument(self):
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        rows = self.table.rowCount()
        columns = self.table.columnCount()
        table = cursor.insertTable(rows + 1, columns)
        format = table.format()
        format.setHeaderRowCount(1)
        table.setFormat(format)
        format = cursor.blockCharFormat()
        format.setFontWeight(QtGui.QFont.Bold)
        for column in range(columns):
            cursor.setCharFormat(format)
            cursor.insertText(
                self.table.horizontalHeaderItem(column).text())
            cursor.movePosition(QtGui.QTextCursor.NextCell)
        for row in range(rows):
            for column in range(columns):
                cursor.insertText(
                    self.table.item(row, column).text())
                cursor.movePosition(QtGui.QTextCursor.NextCell)
        return document

if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())

有人知道吗?或者有一个在pyqt5中横向打印的sn-p代码?谢谢!

【问题讨论】:

    标签: python printing pyqt5 orientation landscape


    【解决方案1】:

    QPrinter::方向

    这个枚举类型(不要与方向混淆)用于指定每个页面的方向。

    Constant          Value      Description
    QPrinter::Portrait  0   the page's height is greater than its width.
    QPrinter::Landscape 1   the page's width is greater than its height.
    
    from PyQt5 import QtWidgets, QtCore, QtPrintSupport, QtGui
    
    class Window(QtWidgets.QWidget):
        def __init__(self):
            QtWidgets.QWidget.__init__(self)
            self.setWindowTitle(self.tr('Document Printer'))
            self.table = QtWidgets.QTableWidget(200, 5, self)
    
            for row in range(self.table.rowCount()):
                for col in range(self.table.columnCount()):
                    item = QtWidgets.QTableWidgetItem('(%d, %d)' % (row, col))
                    item.setTextAlignment(QtCore.Qt.AlignCenter)
                    self.table.setItem(row, col, item)
            self.table.setHorizontalHeaderLabels(
                'SKU #|NAME|DESCRIPTION|QUANTITY|PRICE'.split('|'))
            self.buttonPrint = QtWidgets.QPushButton('Print', self)
            self.buttonPrint.clicked.connect(self.handlePrint)
            self.buttonPreview = QtWidgets.QPushButton('Preview', self)
            self.buttonPreview.clicked.connect(self.handlePreview)
            layout = QtWidgets.QGridLayout(self)
            layout.addWidget(self.table, 0, 0, 1, 2)
            layout.addWidget(self.buttonPrint, 1, 0)
            layout.addWidget(self.buttonPreview, 1, 1)
    
        def handlePrint(self):
            dialog = QtPrintSupport.QPrintDialog()
            if dialog.exec_() == QtWidgets.QDialog.Accepted:
                self.handlePaintRequest(dialog.printer())
    
        def handlePreview(self):
            dialog = QtPrintSupport.QPrintPreviewDialog()
            dialog.paintRequested.connect(self.handlePaintRequest)
    
            dialog.exec_()
    
        def handlePaintRequest(self, printer):
    
            print("printer --> ", printer.orientation())
            printer.setOrientation(QtPrintSupport.QPrinter.Landscape)     # <------------
            print("printer 2--> ", printer.orientation())
    
            document = self.makeTableDocument()
            document.print_(printer)
    
        def makeTableDocument(self):
            document = QtGui.QTextDocument()
            cursor = QtGui.QTextCursor(document)
            rows = self.table.rowCount()
            columns = self.table.columnCount()
            table = cursor.insertTable(rows + 1, columns)
            format = table.format()
            format.setHeaderRowCount(1)
            table.setFormat(format)
            format = cursor.blockCharFormat()
            format.setFontWeight(QtGui.QFont.Bold)
            for column in range(columns):
                cursor.setCharFormat(format)
                cursor.insertText(
                    self.table.horizontalHeaderItem(column).text())
                cursor.movePosition(QtGui.QTextCursor.NextCell)
            for row in range(rows):
                for column in range(columns):
                    cursor.insertText(
                        self.table.item(row, column).text())
                    cursor.movePosition(QtGui.QTextCursor.NextCell)
            return document
    
    if __name__ == '__main__':
    
        import sys
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.resize(640, 480)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 这就是我要找的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2010-09-13
    相关资源
    最近更新 更多