QT的打印机相关的类需要使用printsupport库,其实底层都是使用cups进行打印的。
QT += core gui printsupport
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPrinter>
class QPushButton;
class QHBoxLayout;
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QHBoxLayout *m_mainLayout;
QWidget *m_main;
QPushButton *m_btn;
public slots:
void clickPrinter();
void slotPrintReviewPaint(QPrinter *printer);
};
#endif // MAINWINDOW_H
QPrinter中有很多属性可以设置,但是有些打印机可能不支持这些设置,导致打印预览有很多问题。
mainwindow.cpp
#include "mainwindow.h"
#include <QPushButton>
#include <QWidget>
#include <QHBoxLayout>
#include <QPrinter>
#include <QPainter>
#include <QPrintPreviewDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_mainLayout(new QHBoxLayout(this))
, m_main(new QWidget(this))
, m_btn(new QPushButton("打印预览", m_main))
{
m_main->setLayout(m_mainLayout);
m_mainLayout->addWidget(m_btn);
connect(m_btn, &QPushButton::clicked, this, &MainWindow::clickPrinter);
setCentralWidget(m_main);
}
void MainWindow::clickPrinter()
{
QPrinter printer;
//----------------- 设置打印机属性 -------------
// 打印预览不生效
printer.setDuplex(QPrinter::DuplexLongSide);
printer.setPageSize(QPrinter::A3);
// 打印预览生效
printer.setDoubleSidedPrinting(true);
printer.setOrientation(QPrinter::Landscape);
printer.setNumCopies(5);
printer.setFromTo(2, 5);
QPrintPreviewDialog pdlg(&printer);
// 打印绘制消息
connect(&pdlg, SIGNAL(paintRequested(QPrinter *)),
SLOT(slotPrintReviewPaint(QPrinter *)));
pdlg.exec();
}
void MainWindow::slotPrintReviewPaint(QPrinter *printer)
{
QPainter p(printer);
int pageNum = 5;
for (int i = 0; i < pageNum; i++) {
if (i != 0) printer->newPage(); // 支持多页打印
p.drawText(100, 100, "asdfa" + QString::number(i));
}
}
MainWindow::~MainWindow() {}
函数slotPrintReviewPaint(QPrinter *printer)很重要,你想要打印机的数据都可以在这里进行绘制,
最终你绘制的内容都会被打印出来。
QPrinter::newPage()用来新建一个页面。