作爲第一次使用QT打印功能我確實被嚇到了,在別人鼓吹QPainter強大的時候我不得不考慮工程裏大量的圖表及曲線圖現在都需要一條一條線來畫,我似乎看到了我被老闆炒魷魚並踢出辦公室的情景。
圖表費點勁還可以用Html(textDocument.setHtml(html); textDocument.print(&printer);)的方法實現。曲線圖呢?座標軸的刻度尺,刻度對應的數字大小、位置,曲線縮放比例,每一個繪圖點的絕對及相對座標(絕對座標零點是在紙的左上角,相對座標零點是在座標軸的左下角)……。在網上查閱了一些資料,在有些網友提供的代碼裏,他們還真的是一筆一筆畫出來的,計算圖表的高與寬,手動分頁……。
就在我準備先用CAD打個底稿,再用代碼實現的時候,我看到了
painter.drawPixmap(0, 0, QPixmap::grabWidget(&Widget,int x,int y,int wide,int high));
這行代碼的意思是說QPixmap類有一個方法grabWidget,可以把界面或控件轉爲圖片,然後painter可以把這個圖片打印出來。我寫了一段代碼如下:
QPrinter printer(QPrinter::HighResolution);
QPrintDialog printDialog(&printer, this);
if (printDialog.exec() == QDialog::Accepted) {
QWidget *myForm=new QWidget(this);
myForm->setObjectName(QString::fromUtf8("Form"));
myForm->resize(400, 300);
QTableWidget *tableWidget;
tableWidget = new QTableWidget(myForm);
tableWidget->setColumnCount(3);
tableWidget->setRowCount(4);
tableWidget->setObjectName(QString::fromUtf8("tableWidget"));
tableWidget->setGeometry(QRect(0, 0,400, 300));
QPainter painter(&printer);
painter.drawPixmap(0, 0, QPixmap::grabWidget(0,0,400,300));
}
從打印機出來白紙上空空如也!究其原因,原來是grabWidget偷樑換柱了,將最後一行改一下
QPixmap p_w_picpath;
p_w_picpath=p_w_picpath.grabWidget(myForm,0,0,400,300);
painter.drawPixmap(0,0,p_w_picpath);
現在好了。有影子了,但顯示比例不對,修改如下:
QPainter painter(printer);
QPixmap p_w_picpath;
p_w_picpath=p_w_picpath.grabWidget(AllView,0,0,400, 300);
QRect rect = painter.viewport();
QSize size = p_w_picpath.size();
size.scale(rect.size(), Qt::KeepAspectRatio); //此處保證圖片顯示完整
painter.setViewport(rect.x(), rect.y(),size.width(), size.height());
painter.setWindow(p_w_picpath.rect());
painter.drawPixmap(0,0,p_w_picpath);
現在圖片顯示完整並且自動滿幅比例
現在我還想提供預覽功能,並且可選擇輸出爲PDF文檔或輸出到打印機
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer,this);
connect(&preview, SIGNAL(paintRequested(QPrinter *)),this,SLOT(plotPic(QPrinter *)));
QMessageBox msgBox;
msgBox.setText(tr("請選擇打印方式"));
msgBox.addButton(tr("輸出到文檔"),QMessageBox::AcceptRole);
msgBox.addButton(tr("輸出到打印機"),QMessageBox::RejectRole);
if(msgBox.exec()==QMessageBox::AcceptRole)
printer.setOutputFormat(QPrinter::PdfFormat);
preview.exec();
QPrintPreviewDialog類提供了一個打印預覽對話框,裏面功能比較全,paintRequested(QPrinter *printer)是系統提供的,當preview.exec()執行時該信號被觸發,plotPic(QPrinter *printer)是用戶自定義的槽函數,圖像的繪製就在這個函數裏。printer.setOutputFormat(QPrinter::PdfFormat)是QT提供的輸出格式控制,是可以直接輸出PDF文件的。