QT作為一款輕量級的集成開發環境,其設計的目標是使開發人員利用QT這個應用程序框架更加快速及輕易的開發應用程序。要達到此目的,要求QT必須能夠跨平台,QT能夠在32位及64位的Linux,MAC OS X以及Windows上運行。
現在我們想在項目中加入一項打印功能,即使在不同的操作系統環境下,仍然能有相同的用戶體驗,在實現中發現QT對打印的支持不是那么友好。我們希望在跨平台的情況下,能打印各種文檔,比如用戶的簡歷,發現如果不調用對應操作系統的內核外殼打印函數,這項工作變得異常艱難。我們希望用QT自帶的函數庫,來實現簡單的打印功能,這樣就實現了一次編碼,多環境使用的目的。
下面我們分別介紹這兩種方法。
一、調用內核外殼打印函數
Linux下面相對比較容易,使用lpr –p [printer] [fileName]即可,即如果想把file.cpp文件送到打印機pl則使用lpr –p pl file.cpp即可。
Windows下,我們實現打印既定文件路徑的文檔時,我們調用windows內核命令執行函數,實現打印功能。具體代碼如下:
bool printFile(const QString & filePath) { // create a printer QPrinter printer; QString printerName = printer.printerName(); // no default printer or no file return false if( printerName.size() == 0 || filePath.size() == 0) return false; QFileInfo fi(filePath); if(!fi.exists()) return false; int ret = 0; ret = (int)ShellExecuteW(NULL, QString("print").toStdWString().c_str(), filePath.toStdWString().c_str(), NULL, NULL, SW_HIDE); // if return number bigger than 31 indicate succ if (ret > SE_ERR_NOASSOC) return true; return false; } |
二、使用QT自定義的類和函數實現打印文件的功能
className | function |
QAbstractPrintDialog | base implementation for print dialogs used to configure printers |
QPageSetupDialog | configuration dialog for the page-related options on a printer |
QPrintDialog | Dialog for specifying the printer's configuration |
QPrintEngine | Defines an interface for how QPrinter interacts with a given printing subsystem |
QPrintPreviewDialog | Dialog for previewing and configuring page layouts for printer output |
QPrintPreviewWidget | Widget for previewing page layouts for printer output |
QPrinter | Paint device that paints on a printer |
QPrinterInfo | Gives access to information about existing printers |
QT中和打印文件相關的類如下所示,它們分別是:
- 抽象文檔打印對話框類,提供配置打印機的打印對話框基本實現;
- 頁面設置對話框類,和打印頁面相關參數的配置對話框;
- 打印對話框類,指定打印機配置的對話框;
- 打印引擎類,定義了QPrinter類如何與打印子系統交互的接口;
- 打印預覽對話框類,用來預覽和配置頁面布局的對話框;
- 打印預覽控件類,預覽頁面布局的控件;
- 打印機類,指示打印機如何工作。
QT中實現打印的方法
在QT中如果想實現打印,首先,我們需要構造一個打印機類(QPrinter)對象, 其次,使用此對象構造一個打印對話框類(QprinterDialog)對象。如下所示:
QPrinter printer; QprinterDialog *dialog = new QprintDialog(&printer, this); dialog->setWindowtitle(tr(“Print Document”)); if(editor->textCursor().hasSelection()) dialog->addEnabledOption(QabstractPrintDialog::PrintSelection); if (dialog->exec() != QDialog::Accepted) return; |
最后附上在項目中,我們如何利用QT自身類,來實現這個跨平台的打印功能。
首先,在頭文件中指定槽函數:
private slots: void doPrint(); void doPrintPreview(); void printPreview(QPrinter *printer); void createPdf(); void setUpPage(); 具體實現如下: void MainWindow::doPrint() { // 創建打印機對象 QPrinter printer; // 創建打印對話框 QString printerName = printer.printerName(); if( printerName.size() == 0) return; QPrintDialog dlg(&printer, this); //如果編輯器中有選中區域,則打印選中區域 if (ui->textEdit->textCursor().hasSelection()) dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection); // 如果在對話框中按下了打印按鈕,則執行打印操作 if (dlg.exec() == QDialog::Accepted) { ui->textEdit->print(&printer); // print the existing document by absoult path // printFile("D:/myRSM.doc"); } } // 打印預覽 void MainWindow::doPrintPreview() { QPrinter printer; // 創建打印預覽對話框 QPrintPreviewDialog preview(&printer, this); // 當要生成預覽頁面時,發射paintRequested()信號 connect(&preview, SIGNAL(paintRequested(QPrinter*)), this,SLOT(printPreview(QPrinter*))); preview.exec(); } void MainWindow::printPreview(QPrinter *printer) { ui->textEdit->print(printer); } // 生成PDF文件 void MainWindow::createPdf() { 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); } } // 頁面設置 void MainWindow::setUpPage() { QPrinter printer; QPageSetupDialog pageSetUpdlg(&printer, this); if (pageSetUpdlg.exec() == QDialog::Accepted) { printer.setOrientation(QPrinter::Landscape); } else { printer.setOrientation(QPrinter::Portrait); } } |
以上,僅為摸索QT的一點心得,供大家共同交流實踐,不足之處歡迎大家指出。
http://express.ruanko.com/ruanko-express_75/tech-overnight1.html
http://blog.csdn.net/jdh99/article/details/42585987