PyQt5(一百零九)绘图API: 绘制表格到打印机打印预览的案例QPainter QPrintPreviewDialog
必须在paintEvent事件方法中重载,绘制各种元素。2.各种图形(直线,点,椭圆,弧形,扇形,多边形)绘图API: 绘制表格到打印机打印预览的案例。5.设置打印机参数,纵向横向,纸张大小等。
·
绘图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_())
更多推荐



所有评论(0)