小工具知识网

当前位置: 首页 > 行业知识 > Qt打印,QPdfWriter,QPrinter,QPrintPreviewWidget

行业知识

Qt打印,QPdfWriter,QPrinter,QPrintPreviewWidget

2026-11-01 05:05:57 来源:互联网转载

一、QPdfWriter的使用

常用方法介绍:

构造函数QPdfWriter(QIODevice *device)和QPdfWriter(const QString &filename)

前者可以���定一个io设备指针,例如QFile,后者直接输入文件名,pdf将保存至该文件名。

()

setPageMargins(const QMarginsF &margins)

设置页面边框距离

setPageOrientation(QPageLayout::Orientation orientation)

设置页面方向:QPageLayout::Portrait 纵向、QPageLayout::Landscape 横向

()

setPageSize(const QPageSize &pageSize)

设置页面大小:常用的为QPageSize::A4

setResolution(int resolution)

设置分辨率:resolution为dpi

关于DPI叙述见(四)

QFile file("D:/test.pdf");file.open(QIODevice::WriteOnly);QPdfWriter pdf(&file);pdf.setPageMargins(QMarginsF(30,30,30,30));pdf.setPageOrientation(QPageLayout::Portrait);pdf.setPageSize(QPageSize::A4);pdf.setResolution(76);//使用QPainter向pdf绘制内容QPainter painter(&pdf);···file.flush();file.close();

二、QPrinter使用

QPdfWriter和QPrinter都继承于QPagedPaintDevice,因此他们功能相似,前者能做的后者基本也能做。常见的区别有:QPrinter能与QPrintPreviewWidget搭配使用

值得注意的一个设置:setOutputFormat(QPrinter::OutputFormat format)

QPrinter::NativeFormat 普通模式;QPrinter::PdfFormat 输出至pdf

若设置为QPrinter::PdfFormat 则将无法输出至预览界面,即无法输出到QPrintPreviewWidget

三、QPrintPreviewWidget使用

QPrintPreviewWidget继承于QWidget类,因此应把他视为界面控件类,具有QWidget的特性。基本用于预览文档。

QPrinter *printer = new QPrinter();printer->setPageSize(QPrinter::A4);printer->setOrientation(QPrinter::Portrait);printer->setResolution(300);printer->setPageMargins(QMarginsF(0,0,0,0));QPrintPreviewWidget *view = new QPrintPreviewWidget(printer,this)view->setZoomMode(QPrintPreviewWidget::FitInView);//FitInView:根据视野大小,自动缩放,会完整显示一页;FitToWidth:根据宽度缩放,会无法完整显示一页connect(view, SIGNAL(paintRequested(QPrinter*)), this, SLOT(drawPrinter(QPrinter*)));//drawPrinter为绘制QPrinter的函数view->repaint();void drawPrinter(QPrinter *printer){QPainter painter(printer);painter.drawText(···);···}

四、DPI、PPI简述

DPI或PPI描述的都是分辨率(Resolution),分别指的是 点/英寸 和 像素/英寸

Qt中的width()、height()等指的都是像素,所以Qt中实际使用的是PPI。

例如PPI=300描述的是一英寸里有300像素点,常用于描述显示器。

上面的QPdfWriter和QPrinter中都出现了setResolution()函数,我们在这里要填入什么数值是合适的呢?

1.先看页面尺寸,以常用的A4纸为例,A4的大小为210mm297mm,换成英寸为8.2611.69
2.再看我们的绘制(预览)控件大小,单位是像素,例如我要预览A4大小的文档,我绘制了一个630*891大小的QPrintPreviewWidget
3.计算PPI,630/8.26=76 因此在这种情况下,我们应setResolution(76)

五、打印

根据前面的内容我们以及能输出文件,我们自行打开文件打印,或者使用桌面服务QDesktopServices::openUrl(QUrl(“file:///D:/11.pdf”));在程序中打开。

但是总的来说不够便利,能不能直接在我们的软件上点击按钮直接执行打印呢?

有两种方案:

1.使用QPrintDialog
QPrintDialog printdia(printer);//printer为上述的QPrinterprintdia.exec();//弹出打印界面
上述方法理论上可行,但实际上打印机没反应。
2.使用QWidget::render(QPaintDevice *target, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))
中间参数很长,但实际上我们只要填一个QPrinter*即可。这个方法我们只需要用到QPrinter就好。
新建一个QWidget类,重写paintEvent事件
void paintEvent(QPaintEvent *event) override;{QPainter painter(this);···}
再创建QPrinter
    QPrinter *printer = new QPrinter();    printer->setPageSize(QPrinter::A4);    printer->setResolution(76);    printer->setPageMargins(QMarginsF(0,0,0,0));    printer->setOrientation(QPrinter::Portrait);    this->render(printer);

上一篇:redandyellow怎么连读?

下一篇:中心云服务器图片怎么导出?