Qt打印,QPdfWriter,QPrinter,QPrintPreviewWidget

一、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为上述的QPrinter
printdia.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);

你可能感兴趣的:(QT,qt)