淺談QT打印功能實現


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM