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

Pyside6中QGraphicsView打印预览页面方向与尺寸设置失效问题

问题核心原因

  • 你单独构造的QPageLayout设置后没有正确应用到QPrinter,QPrintPreviewDialog初始化时会重置部分打印参数,直接调用QPrinter内置的页面参数设置方法兼容性更好
  • 直接调用QGraphicsView.render()没有适配打印机的分辨率和页面尺寸,导致设置的横屏、A3参数没有同步到渲染逻辑

修正后的可运行代码

from PySide6 import QtCore, QtPrintSupport, QtGui

def onPreview(self):
    printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.HighResolution)
    # 直接用QPrinter内置方法设置参数,避免被预览对话框重置
    printer.setPageOrientation(QtGui.QPageLayout.Landscape)
    printer.setPageSize(QtGui.QPageSize.A3)
    # 可选:设置页边距,可根据需求调整数值,单位为毫米
    printer.setPageMargins(QtCore.QMarginsF(10, 10, 10, 10), QtGui.QPageLayout.Millimeter)

    preview = QtPrintSupport.QPrintPreviewDialog(printer, self.parent)
    preview.paintRequested.connect(self.handlePaintRequest)
    preview.exec_()

# 处理打印请求
def handlePaintRequest(self, printer):
    painter = QtGui.QPainter(printer)
    # 获取打印机页面的可绘制矩形(适配高分辨率模式)
    page_rect = printer.pageRect(QtPrintSupport.QPrinter.DevicePixel)
    # 获取整个场景的矩形(如果只需打印当前视口显示内容,替换为self.parent.view.viewport().rect())
    content_rect = self.parent.view.scene().sceneRect()
    
    # 计算等比缩放系数,保证内容完整显示在页面内
    scale = min(page_rect.width() / content_rect.width(), 
                page_rect.height() / content_rect.height())
    
    # 调整绘制坐标:先平移到页面中心,缩放后再平移回内容中心,实现居中打印
    painter.translate(page_rect.center())
    painter.scale(scale, scale)
    painter.translate(-content_rect.center())
    
    # 渲染场景(如果只需打印当前视口内容,替换为self.parent.view.render(painter))
    self.parent.view.scene().render(painter)
    painter.end()

关键修改说明

  • 废弃单独构造QPageLayout的逻辑,直接调用QPrinter原生参数设置方法,确保横屏、A3尺寸参数不会被预览对话框重置
  • 新增打印适配逻辑,根据页面尺寸和内容尺寸自动计算等比缩放比例,避免内容拉伸、截断
  • 支持两种打印模式:打印整个场景,或者打印当前视图显示的内容,按需调整对应代码即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:02