绘图API: 绘制表格到打印机打印预览的案例

绘图API: 绘制表格到打印机打印预览的案例
1.文本
2.各种图形(直线,点,椭圆,弧形,扇形,多边形)
3.图像
QPainter
painter = QPainter()
painter.begin()
painter.drawText()
painter.end()
4.打印预览
5.设置打印机参数,纵向横向,纸张大小等
必须在paintEvent事件方法中重载,绘制各种元素

案例图片

图片案例

打印预览窗口案例图片

打印预览

代码

import sys
from PyQt5.QtCore import Qt, QRegExp, QDir, QRect, QPoint, QDateTime
from PyQt5.QtGui import QIcon, QFont, QPalette, QPixmap, QIntValidator, QDoubleValidator, QRegExpValidator, QPainter, \
    QColor
from PyQt5.QtPrintSupport import QPrinter, QPrintPreviewDialog
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip, QHBoxLayout, QMainWindow, QLabel, QVBoxLayout, \
    QDialog, QLineEdit, QGridLayout, QFormLayout, QTextEdit, QRadioButton, QCheckBox, QSlider, QSpinBox, QMessageBox, \
    QInputDialog, QFontDialog, QColorDialog, QFileDialog

'''
绘图API: 绘制表格到打印机打印预览的案例
1.文本
2.各种图形(直线,点,椭圆,弧形,扇形,多边形)
3.图像
QPainter
painter = QPainter()
painter.begin()
painter.drawText()
painter.end()
4.打印预览
5.设置打印机参数,纵向横向,纸张大小等
必须在paintEvent事件方法中重载,绘制各种元素
'''


class drawDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        try:
            # 设置定位和左上角坐标
            self.setGeometry(300, 100, 900, 800)
            # 设置窗口标题
            self.setWindowTitle('在窗口上绘制表格 打印预览表 的演示')
            # 设置窗口图标
            # self.setWindowIcon(QIcon('../web.ico'))
            btn = QPushButton(self)
            btn.setText('打印')
            btn.move(400,5+15*50)
            btn.clicked.connect(self.pprintView)
        except Exception as e:
            print(e, e.__traceback__.tb_lineno, e.__traceback__.tb_frame.f_globals["__file__"])

    # 重载paintEvent事件,将表格内容画到主窗口
    def paintEvent(self,event):
        try:
            painter = QPainter(self)
            painter.begin(self)
            # 画表
            self.drawTable(painter)

            painter.end()

        except Exception as e:
            print(e, e.__traceback__.tb_lineno, e.__traceback__.tb_frame.f_globals["__file__"])

    # 画表格到画板
    def drawTable(self,painter,no = 14):
        try:
            # 表格起点,
            x,y = 0,0
            # 表格高度和宽度
            w,h = 900,800

            # 画大框
            painter.drawRect(x+5,y+5,w-10,h-10-50)

            # 表格标题
            # 画笔字体
            painter.setFont(QFont('宋体',22))
            # 标题文字
            painter.drawText(QRect(x,3,w,50),Qt.AlignCenter,"盘点详单")

            # 坐标原点
            x1,x2,y1,y2 = 0,0,0,0

            painter.setPen(QColor(0, 0, 0))
            painter.setFont(QFont('SimDun',16))

            for i in range(no):
                # 横线
                painter.drawLine(QPoint(x1+5, y1+50+i*50), QPoint(x2+5+w-10, y2+50 +i*50));
                # 序号
                painter.drawText(QRect(x1+5,y1+50+i*50,50,50),Qt.AlignCenter,str(i+1));

            # 表下注释
            painter.setFont(QFont('宋体', 12))
            painter.setPen(QColor(0, 0, 0))
            painter.drawText(QRect(x01 + 5, y1 + 50 + 14 * 50, 590, 50), Qt.AlignLeft, "注:库房盘点明细以实际数量为准.");
            # 制表时间
            ctime = QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
            painter.drawText(QRect(x1 + 5+600, y1 + 50 + 14 * 50, 260, 50), Qt.AlignLeft, "时间:"+ctime);

        except Exception as e:
            print(e, e.__traceback__.tb_lineno, e.__traceback__.tb_frame.f_globals["__file__"])

    # 将内容写入打印设备
    def printDocument(self,printer):
        # 新建画板开始画
        painter = QPainter()
        painter.begin(printer)
        # 设置壁画颜色
        painter.setPen(Qt.black)

        # 设置打印的页数
        pages = 1
        for i in range(pages):
            self.drawTable(painter)
            # 不是最后一页就分页
            if(i != pages-1):
                printer.newPage() #分页
                painter.setPen(Qt.black)

        painter.end()

    # 要打印的内容
    def handlePaintRequest(self,printer):
        self.printDocument(printer)

    # 打印预览
    def pprintView(self):
        try:
            print('打印预览执行开始')
            # 设置打印设备
            printer = QPrinter(QPrinter.ScreenResolution)
            # 设置打印纸张
            printer.setPageSize(QPrinter.A4)
            # 设置纸张方向 0 纵向 1 横向
            printer.setOrientation(0)
            # self.printDocument(printer)
            preview = QPrintPreviewDialog(printer)
            # 将打印预览信信号连接到槽
            preview1.paintRequested.connect(lambda1: self.handlePaintRequest(preview.printer()))
            # 打印预览窗口最大化
            preview.setWindowState(Qt.WindowMaximized)
            # 执行打印预览
            if preview1.exec_():
                print("打印预览执行结束")

        except Exception as e:
            print(e, e.__traceback__.tb_lineno, e.__traceback__.tb_frame.f_globals["__file__"])


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 设置应用图标
    app.setWindowIcon(QIcon('../web.ico'))
    w = drawDemo()
    w.show()
    sys.exit(app.exec_())
Logo

一站式 AI 云服务平台

更多推荐