QT 打印的简单实现

来源:互联网 发布:js控制li隐藏与显示 编辑:程序博客网 时间:2024/05/17 04:54


  图表费点劲还可以用Html(textDocument.setHtml(html); textDocument.print(&printer);)的方法实现。曲线图呢?坐标轴的刻度尺,刻度对应的数字大小、位置,曲线缩放比例,每一个绘图点的绝对及相对坐标(绝对坐标零点是在纸的左上角,相对坐标零点是在坐标轴的左下角)……。在网上查阅了一些资料,在有些网友提供的代码里,他们还真的是一笔一笔画出来的,计算图表的高与宽,手动分页……。 作为第一次使用QT打印功能我确实被吓到了,在别人鼓吹QPainter强大的时候我不得不考虑工程里大量的图表及曲线图现在都需要一条一条线来画,我似乎看到了我被老板炒鱿鱼并踢出办公室的情景。

  就在我准备先用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 image;
         image=image.grabWidget(myForm,0,0,400,300);
         painter.drawPixmap(0,0,image);

现在好了。有影子了,但显示比例不对,修改如下:

            QPainter painter(printer);           

            QPixmap image;
            image=image.grabWidget(AllView,0,0,400, 300);
            QRect rect = painter.viewport();
            QSize size = image.size();
            size.scale(rect.size(), Qt::KeepAspectRatio);     //此处保证图片显示完整
            painter.setViewport(rect.x(), rect.y(),size.width(), size.height());
            painter.setWindow(image.rect());
            painter.drawPixmap(0,0,image);

现在图片显示完整并且自动满幅比例

现在我还想提供预览功能,并且可选择输出为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文件的。

原创粉丝点击