Qt實現(xiàn)保存、瀏覽、預覽、打印功能的示例代碼
Qt提供了以文本、圖片、HTML等方式來實現(xiàn)對文檔的操作,主要用到了QPrinter類和QPainter類,用到了QFileDialog文件窗口、QPrintPreviewDialog預覽窗口類和QPrintDialog打印窗口類,Qt5也提供了QPdfWriter類來實現(xiàn)對pdf的操作,這里并不包括打開pdf文件,Qt沒有提供任何方法來直接像文件瀏覽器一樣打開pdf文件,可以用第三方庫來實現(xiàn)。
這里采用了圖片的方式來實現(xiàn)保存、預覽和打印,其實 三個功能基本上一樣。
1、保存PDF
(1)保存某個控件里的內(nèi)容
一些輸入類控件可以直接調(diào)用print()函數(shù),一些顯示類的控件可以直接調(diào)用render()函數(shù),一些控件不具備這個功能。代碼如下:
void MainWindow::on_btnSave_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("導出PDF文件"), QString(), "*.pdf");
if (!fileName.isEmpty())
{
// 如果文件后綴為空,則默認使用.pdf
if (QFileInfo(fileName).suffix().isEmpty())
{
fileName.append(".pdf");
}
QPrinter printer;
// 指定輸出格式為pdf
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
// ui->textEdit->print(&printer);
ui->tableWidget->render(&printer);
}
}
(2)保存某些控件里的內(nèi)容
這里需要將要保存的所有內(nèi)容放在一個容器里面,比如放在QWidget上,同樣可以用上面的方式來保存,下面用的是以圖片的方式來保存。代碼如下:
void MainWindow::on_btnSave_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("保存PDF文件"), QString(), "*.pdf");
if (!fileName.isEmpty())
{
// 如果文件后綴為空,則默認使用.pdf
if (QFileInfo(fileName).suffix().isEmpty())
{
fileName.append(".pdf");
}
QPrinter printerPixmap(QPrinter::HighResolution);
//自定義紙張大小,這里要打印的內(nèi)容都在stackedWidget上
printerPixmap.setPageSize(QPrinter::Custom);
printerPixmap.setPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()), QPrinter::Point);
//設(shè)置紙張大小為A4,這里注釋掉了,建議自定義紙張 ,否則保存的就會有很多空白
//printerPixmap.setPageSize(QPrinter::A4);
//橫向打印
printerPixmap.setOrientation(QPrinter::Landscape);
//設(shè)置輸出格式為pdf
printerPixmap.setOutputFormat(QPrinter::PdfFormat);
//設(shè)置輸出路徑
printerPixmap.setOutputFileName(fileName);
//獲取界面的圖片
QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect());
QPainter painterPixmap;
painterPixmap.begin(&printerPixmap);
QRect rect = painterPixmap.viewport();
int x = rect.width() / pixmap.width();
int y = rect.height() / pixmap.height();
//將圖像(所有要畫的東西)在pdf上按比例尺縮放
painterPixmap.scale(x, y);
//畫圖
painterPixmap.drawPixmap(0, 0, pixmap);
painterPixmap.end();
QMessageBox::information(this, tr("生成PDF"), tr("保存PDF文件成功"), QMessageBox::Ok);
}
}
2、瀏覽
Qt沒有提供瀏覽pdf的方式,可以通過使用第三方庫Poppler來實現(xiàn),這里是相關(guān)文件:官網(wǎng),編譯好的庫文件,所有文件的文件包,實現(xiàn)pdf閱讀器??梢酝ㄟ^官方的源碼來編譯庫,不過可能會非??部?。
我試了這個方法,不過沒有成功,(⊙﹏⊙)b!因為只是需要實現(xiàn)打開pdf文件的一個小功能而不是實現(xiàn)類似pdf閱讀器,所以就換了一個方法,回頭搞閱讀器的時候還是得研究一番。
這里用的是進程的方法來使用電腦上的閱讀器打開文件,優(yōu)點是:簡單,就兩行代碼;缺點是:①電腦上沒下載閱讀器就沒辦法了;②效率應該沒有使用第三方庫高。
代碼如下:
QString fileName = QFileDialog::getOpenFileName(this, tr("選擇文件"),QString(),
tr("PDF 文檔 (*.pdf);;所有文件 (*.*)"));
QProcess * p = new QProcess;
p->start("C:\\Program Files (x86)\\Foxit Software\\Foxit Reader Plus\\FoxitReaderPlus.exe",
QStringList() << fileName);
3、預覽
預覽使用了預覽對話框QPrintPreviewDialog,也是用的圖片的方式來預覽pdf,其實預覽窗口已經(jīng)自帶了打印按鈕,在這個界面已經(jīng)可以打印了。代碼如下:
void MainWindow::on_btnPreview_clicked()
{
QPrinter printer(QPrinter::HighResolution);
//自定義紙張大小
printer.setPageSize(QPrinter::Custom);
printer.setPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()),
QPrinter::Point);
QPrintPreviewDialog preview(&printer, this);
preview.setMinimumSize(1000,600);
connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreviewSlot(QPrinter*)));
preview.exec ();
}
void MainWindow::printPreviewSlot(QPrinter *printerPixmap)
{
printerPixmap->setOrientation(QPrinter::Landscape);
//獲取界面的圖片
QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect());
QPainter painterPixmap(this);
painterPixmap.begin(printerPixmap);
QRect rect = painterPixmap.viewport();
int x = rect.width() / pixmap.width();
int y = rect.height() / pixmap.height();
painterPixmap.scale(x, y);
painterPixmap.drawPixmap(0, 0, pixmap);
painterPixmap.end();
}
4、打印
打印使用了打印對話框QPrintDialog,如何打印文本框內(nèi)容的話直接用print()函數(shù)就行,否則還是用打印圖片的方式,和預覽不同的其實就是使用的窗口類不同其余都差不多,代碼如下:
void MainWindow::on_btnPrint_clicked()
{
// 創(chuàng)建打印機對象
QPrinter printer;
// 創(chuàng)建打印對話框
QString printerName = printer.printerName();
if( printerName.size() == 0)
return;
QPrintDialog dlg(&printer, this);
//如果編輯器中有選中區(qū)域,則打印選中區(qū)域
if (ui->textEdit->textCursor().hasSelection())
dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
// 如果在對話框中按下了打印按鈕,則執(zhí)行打印操作
if (dlg.exec() == QDialog::Accepted)
{
ui->textEdit->print(&printer);
}
}
void MainWindow::on_btnPrint_2_clicked()
{
QPrinter printerPixmap;
QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect()); //獲取界面的圖片
QPrintDialog print(&printerPixmap, this);
if (print.exec())
{
QPainter painterPixmap;
painterPixmap.begin(&printerPixmap);
QRect rect = painterPixmap.viewport();
int x = rect.width() / pixmap.width();
int y = rect.height() / pixmap.height();
painterPixmap.scale(x, y);
painterPixmap.drawPixmap(0, 0, pixmap);
painterPixmap.end();
}
}
以上這篇Qt實現(xiàn)保存、瀏覽、預覽、打印功能的示例代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Qt圖形圖像開發(fā)之曲線圖模塊QCustomplot庫生成靜態(tài)、動態(tài)曲線詳細教程圖解
- Qt圖形圖像開發(fā)之高性能曲線圖模塊QCustomplot庫詳細使用方法與實例(支持動、靜曲線圖)
- Qt學習教程之對話框消失動畫效果
- Qt學習教程之表格控件螞蟻線詳解
- Qt 使用Poppler實現(xiàn)pdf閱讀器的示例代碼
- QT開發(fā)應用程序的歡迎界面實例
- QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實例
- 在QT5中實現(xiàn)求兩個輸入值的和并輸出(實例)
- QT網(wǎng)絡(luò)編程UDP下C/S架構(gòu)廣播通信(實例講解)
- 淺談Qt中使用CEF的幾個要點(Windows下)
- 深入理解Qt中各種消息框?qū)υ捒虻氖褂?/a>
- Qt實現(xiàn)FTP的上傳和下載的實例代碼
- Qt如何設(shè)置窗口屏幕居中顯示以及設(shè)置大小
- Qt圖形圖像開發(fā)之曲線圖表庫QChart編譯安裝詳細方法與使用實例
相關(guān)文章
Visual Studio 2019修改編碼UTF-8的實現(xiàn)
這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
C++ 創(chuàng)建桌面快捷方式 開始菜單的實現(xiàn)代碼
這篇文章介紹了C++ 創(chuàng)建桌面快捷方式,開始菜單的實現(xiàn)代碼,需要的朋友可以參考一下2013-06-06
C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下2021-09-09

