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
