You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PyQt5代码实现默认或自动横向打印?

PyQt5 设置默认横向打印的解决方案

当然有办法实现横向打印啦!你可以通过两种常见的方式来配置:一种是让打印/预览对话框默认选中横向选项(用户仍可手动切换回纵向),另一种是强制所有打印操作使用横向。下面是具体的代码修改方案:

方案一:让打印对话框默认使用横向

修改你的handlePrint和handlePreview方法,在创建打印机实例时直接设置打印方向,这样对话框打开时就会默认选中横向:

def handlePrint(self):
    # 创建打印机实例并设置默认方向为横向
    printer = QtPrintSupport.QPrinter()
    printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
    dialog = QtPrintSupport.QPrintDialog(printer, self)
    if dialog.exec_() == QtWidgets.QDialog.Accepted:
        self.handlePaintRequest(dialog.printer())

def handlePreview(self):
    # 预览对话框同样设置默认横向
    printer = QtPrintSupport.QPrinter()
    printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
    dialog = QtPrintSupport.QPrintPreviewDialog(printer, self)
    dialog.paintRequested.connect(self.handlePaintRequest)
    dialog.exec_()

方案二:强制所有打印操作使用横向

如果你希望不管用户怎么设置,都固定用横向打印,可以直接在handlePaintRequest方法里设置打印机方向:

def handlePaintRequest(self, printer):
    # 强制将打印方向设为横向
    printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
    document = self.makeTableDocument()
    document.print_(printer)

这种方式下,即使用户在打印对话框里切换回纵向,最终打印出来的还是横向内容,适合需要固定打印格式的场景。

完整修改后的代码

这里是整合了方案一的完整代码,你可以直接替换原来的代码测试:

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):
        printer = QtPrintSupport.QPrinter()
        printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
        dialog = QtPrintSupport.QPrintDialog(printer, self)
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            self.handlePaintRequest(dialog.printer())
    def handlePreview(self):
        printer = QtPrintSupport.QPrinter()
        printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
        dialog = QtPrintSupport.QPrintPreviewDialog(printer, self)
        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_())

原理很简单:QPrinter的setOrientation方法可以接受QtPrintSupport.QPrinter.Landscape(横向)或QtPrintSupport.QPrinter.Portrait(纵向)参数,以此来控制打印方向。

内容的提问来源于stack exchange,提问作者Eqzt111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:32:52