Qt Print Support模块提供了对打印的支持。最简单的,只需使用一个QPrinter类和一个打印对话框QPrintDialog类就可以完成文档的打印操作
这里简单介绍打印文档,打印预览和生产pdf文档
新建Qt Widget项目,项目名myprint ,类名和基类保持MainWindow和QMainWindow不变,完成后,在myprint.pro文件,添加如下一行代码:
QT += printsupport 然后到设计模式向界面上拖入一个Text Edit。再到mainwindow.h文件中先添加类的前置声明
class QPrinter; 然后添加几个槽的声明:
private slots: void doPrint(); void doPrintPreview(); void printPreview(QPrinter *printer); void createPdf(); 下面到mainwindow.cpp文件中添加头文件
#include #include #include #include #include 在构造函数中定义几个动作:
QAction *action_print = new QAction(tr("打印"),this); QAction *action_printPreview = new QAction(tr("打印预览"),this); QAction *action_pdf = new QAction(tr("生成pdf"),this); connect(action_print,SIGNAL(triggered()),this,SLOT(doPrint())); connect(action_printPreview,SIGNAL(triggered()),this,SLOT(doPrintPreview())); connect(action_pdf,SIGNAL(triggered()),this,SLOT(createPdf())); ui->mainToolBar->addAction(action_print); ui->mainToolBar->addAction(action_printPreview); ui->mainToolBar->addAction(action_pdf); 然后添加那几个槽的定义:
void MainWindow::doPrint() // 打印 { QPrinter printer; // 创建打印机对象 QPrintDialog dlg(&printer, this); // 创建打印对话框 // 如果编辑器中有选中区域,则打印选中区域 if (ui->textEdit->textCursor().hasSelection()) dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection); if (dlg.exec() == QDialog::Accepted) { // 如果在对话框中按下了打印按钮 ui->textEdit->print(&printer); // 则执行打印操作 } } 这里先建立了QPrint对象,然后创建打印对话框,选择打印范围。没有选中范围就打印整个页面
void MainWindow::doPrintPreview() // 打印预览 { QPrinter printer; QPrintPreviewDialog preview(&printer, this); // 创建打印预览对话框 // 当要生成预览页面时,发射paintRequested()信号 connect(&preview, &QPrintPreviewDialog::paintRequested, this, &MainWindow::printPreview); preview.exec(); }
//自定义的槽函数 void MainWindow::printPreview(QPrinter *printer) { ui->textEdit->print(printer); } 使用打印预览对话框来进行打印预览,要关联它的paintRequested信号到槽函数printPreview。 并以传来的QPrinter类对象指针为参数
#ifndef MAINWINDOW_MYPRINT_H
#define MAINWINDOW_MYPRINT_H
#include
class QPrinter;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow_myprint; }
QT_END_NAMESPACE
class MainWindow_myprint : public QMainWindow
{
Q_OBJECT
public:
MainWindow_myprint(QWidget *parent = nullptr);
~MainWindow_myprint();
private:
Ui::MainWindow_myprint *ui;
private slots:
void doPrint();
void DoPrintPreview();
void PrintPreview(QPrinter *printer);
void CreatePdf();
};
#endif // MAINWINDOW_MYPRINT_H
#include "mainwindow_myprint.h"
#include "ui_mainwindow_myprint.h"
#include
#include
#include
#include
#include
//QT5.5打印文档
MainWindow_myprint::MainWindow_myprint(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow_myprint)
{
ui->setupUi(this);
QAction * action_print=new QAction(tr("打印"),this);//by txwtech 2022.9
QAction *action_print_preview=new QAction(tr("打印预览"),this);
QAction *action_pdf=new QAction(tr("创建pdf"),this);
connect(action_print,SIGNAL(triggered()),this,SLOT(doPrint()));
connect(action_print_preview,SIGNAL(triggered()),this,SLOT(DoPrintPreview()));
connect(action_pdf,SIGNAL(triggered()),this,SLOT(CreatePdf()));
ui->toolBar->addAction(action_print);
ui->toolBar->addAction(action_print_preview);
ui->toolBar->addAction(action_pdf);
}
MainWindow_myprint::~MainWindow_myprint()
{
delete ui;
}
void MainWindow_myprint::doPrint()//打印
{
QPrinter printer;
QPrintDialog dlg(&printer,this);//创建打印对话框
//如果编辑框中有选中区域,则打印选中的区域哦
if(ui->textEdit->textCursor().hasSelection())
{
dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
}
if(dlg.exec()==QDialog::Accepted)//如果在对话框中按下了打印按钮
{
ui->textEdit->print(&printer);//执行打印操作
}
}
void MainWindow_myprint::DoPrintPreview()//打印预览
{
QPrinter printer;
QPrintPreviewDialog preview(&printer,this);
//当要生成预览页面时,发射paintRequested()信号
connect(&preview,&QPrintPreviewDialog::paintRequested,this,&MainWindow_myprint::PrintPreview);
preview.exec();
}
void MainWindow_myprint::PrintPreview(QPrinter *printer)
{
ui->textEdit->print(printer);
}
void MainWindow_myprint::CreatePdf()//创建PDF
{
QString file_name=QFileDialog::getSaveFileName(this,tr("导出PDF文件"),QString(),"*.pdf");
if(!file_name.isEmpty())
{
if(QFileInfo(file_name).suffix().isEmpty())
{
file_name.append(".pdf");
}
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(file_name);
ui->textEdit->print(&printer);//执行打印的操作
}
}