• 6623阅读
  • 1回复

求助:  怎么打印一个滚动区域 [复制链接]

上一主题 下一主题
离线maldini3wx
 

只看楼主 正序阅读 楼主  发表于: 2010-04-29
  

  就是一个QTreeWidget,已经显示滚动条,要求把整个QTreeWidget的内容全打印出来.请问如何实现

  grabWidget 只能打印可见区的
离线xtfllbl

只看该作者 1楼 发表于: 2010-04-29
Re:求助:  怎么打印一个滚动区域
转段代码参考:
  1. void QCurveQueryTool::printview()   //printFlag =2 , 打印预览
  2. {
  3.     QPrinter printer(QPrinter::ScreenResolution);
  4.     QPrintPreviewDialog preview(&printer, this);
  5.     preview.setMinimumSize(1000,900);
  6.     connect(&preview, SIGNAL(paintRequested(QPrinter *)),this, SLOT(printTable(QPrinter *)));
  7.     preview.exec();
  8. }
  9. void QCurveQueryTool::printTable(QPrinter *printer)
  10. {
  11.     QString title = QString("曲线打印");
  12.     printTableWidget(table,title,printer);
  13. }
  14. void QCurveQueryTool::printTableWidget(const QTableWidget* view,QString stitile,QPrinter *printer) //printFlag =1,打印表格
  15. {
  16.     double totalWidth = 0.0;
  17.     double totalHeight = 0.0;
  18.     double totalPageHeight=0.0;
  19.     int rows = view->model()->rowCount();   //行总数
  20.     const int cols = view->model()->columnCount(); //列总数
  21.     for (int c = 0; c < cols; ++c)  //求出列宽
  22.     {
  23.         totalWidth += view->columnWidth(c);
  24.     }
  25.     for (int r = 0; r < rows; ++r) //求出行宽
  26.     {
  27.         totalHeight += view->rowHeight(r);
  28.     }
  29.     QPainter painter(printer);
  30.     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  31.     painter.begin(printer);
  32.     QRect area = printer->paperRect();// paperRect();
  33.     QVector<int> startRow;
  34.     QVector<int> endRow;
  35.     int iCount = 0;
  36.     qreal left,top,right,bottom;
  37.     printer->getPageMargins(&left,&top,&right,&bottom,QPrinter::Point);
  38.     cout << "left = " << left << ", right = " << right << ", top = " << top << ", bottom = " << bottom << endl;
  39.     area.setHeight( int(area.height() - top - bottom) );
  40.     area.setWidth( int(area.width() - left - right) );
  41.     for (int p=0; p < rows; p++) //rows中保存了所有的行数 , 找出每次打印的开始行和结束行
  42.     {
  43.         totalPageHeight += view->rowHeight(p); //求出所有的列高度
  44.         int pageFooter = 50 ;  //页脚的高度
  45.         int pageHeader = 50;   //页眉的高度
  46.         if (startRow.size() == 0)
  47.         {
  48.             pageFooter = 50 ;
  49.             pageHeader = 500;
  50.         }
  51.         if ((totalPageHeight >= (area.height() - pageFooter - pageHeader)) || (p == rows -1))  //如果目前累加列的高度大于或者等于可用页面高度 || 到达最后一行
  52.         {
  53.             totalPageHeight = view->rowHeight(p);
  54.             if (p == rows -1)
  55.             {
  56.                 if (p - iCount - 2 < 0)
  57.                 {
  58.                     startRow.push_back(0);
  59.                 }
  60.                 else
  61.                 {
  62.                     startRow.push_back(p - iCount - 2);
  63.                 }
  64.                 endRow.push_back(p);
  65.                 //cout << startRow.at(startRow.size() - 1) << " " << endRow.at(endRow.size() - 1) << endl;
  66.             }
  67.             else
  68.             {
  69.                 if (p - iCount - 2 < 0)
  70.                 {
  71.                     startRow.push_back(0);
  72.                     endRow.push_back(p - 2);
  73.                 }
  74.                 else
  75.                 {
  76.                     startRow.push_back(p - iCount - 1);
  77.                     endRow.push_back(p - 3);
  78.                 }
  79.                 //cout << startRow.at(startRow.size() - 1) << " " << endRow.at(endRow.size() - 1) << endl;
  80.             }
  81.             iCount = 0;
  82.         }
  83.         iCount++;
  84.     }
  85.     QTableWidget *printTable = new QTableWidget();
  86.     //printTable->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
  87.     //printTable->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
  88.     //printTable->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
  89.     //printTable->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  90.     const double xscale = area.width() / totalWidth;
  91.     const double yscale = area.height() / totalHeight;
  92.     //const double pscale = area.height() / totalPageHeight;
  93.     //painter.scale(xscale , yscale); // With the scaling 3 It is Printing all
  94.     //painter.translate(area.x() + xscale, area.y() + pscale); //This is original
  95.     painter.translate(area.x() + xscale, area.y() + yscale);
  96.     //painter.save(); //commented
  97.     //int y=0 ;// This is introduced for the columns
  98.     //view->paintEvent(&event);
  99.     //QPainter paint(this);
  100.     //paint.setPen(Qt::red);
  101.     //paint.drawRect(0, 0, 0, 0);
  102.     QStyleOptionViewItem option;  
  103.     QPen pen;
  104.     pen.setColor(Qt::black);
  105.     pen.setWidth(1);
  106.     painter.setPen(pen);
  107.     int irowcount = -1;
  108.     float rate = 1;
  109.     for(int ipage = 0; ipage < startRow.size();ipage++)  //startRow有大,就有多少页需要打印
  110.     {
  111.         printTable->setColumnCount(view->columnCount() + 1);  //打印的列数为view的列数
  112.         printTable->setRowCount(endRow[ipage] - startRow[ipage] + 2);  //设置当前打印页的行数
  113.         for(int c = 1;c < cols + 1;c++)
  114.         {
  115.             printTable->setColumnWidth( c,(view->columnWidth(c - 1)) );
  116.             QTableWidgetItem *newItem = printTable->item(0,c);
  117.             if (!newItem)  //如果printTable的首行不存在,添加文字或者序号
  118.             {
  119.                 if (view->horizontalHeaderItem(c - 1)) //Returns the horizontal(水平的) header item for column
  120.                     newItem = new QTableWidgetItem(view->horizontalHeaderItem(c - 1)->text());
  121.                 else
  122.                     newItem = new QTableWidgetItem(QString::number(c));
  123.                 printTable->setItem(0,c ,newItem);
  124.             }
  125.             else    //否则,直接设置文字或者序号
  126.             {
  127.                 if (view->horizontalHeaderItem(c - 1))
  128.                     newItem->setText(view->horizontalHeaderItem(c - 1)->text());
  129.                 else
  130.                     newItem->setText(QString::number(c));
  131.             }
  132.         }
  133.     /////////////////////////求出合适的比率,用来完美表格的显示
  134.         QRect firstTable , lastTable;
  135.         QModelIndex firstIndex = printTable->model()->index(0,0);
  136.         QModelIndex lastIndex = printTable->model()->index(0,cols);
  137.         firstTable = printTable->visualRect(firstIndex);
  138.         lastTable =  printTable->visualRect(lastIndex);
  139.         float totalTableWidth = lastTable.topRight().x() - firstTable.topLeft().x();
  140.         float pagerWidth = printer->paperRect().width() - 20 - 20;
  141.         rate = totalTableWidth/pagerWidth;
  142.         cout << "totalTableWidth = " << totalTableWidth << ", pagerWidth = " << pagerWidth << ", rate = " << rate << endl;
  143.     /////////////////////////求出合适的比率,用来完美表格的显示
  144.         for(int c = 1;c < cols + 1;c++)  //重设宽度
  145.         {
  146.             printTable->setColumnWidth( c,int((view->columnWidth(c - 1))/rate) );
  147.         }
  148.         printTable->setColumnWidth(0,view->verticalHeader()->width());  //Returns the table view's vertical header.
  149.         int iRow = 0;
  150.         for(int ir = startRow[ipage]; ir <= endRow[ipage];ir++) //ir变量用来标识当前打印的是哪些行,设置当前打印页的首行
  151.         {
  152.             printTable->setRowHeight(iRow,view->rowHeight(ir));  //Sets the height of the given row to be height.
  153.             for(int ic = 0; ic < view->columnCount(); ic++)  //设置每个单元格的内容
  154.             {
  155.                 QTableWidgetItem *newItem = printTable->item(iRow  + 1,ic + 1);
  156.                 if (!newItem)
  157.                 {
  158.                     if (view->item(ir,ic))
  159.                         newItem = new QTableWidgetItem(view->item(ir,ic)->text());
  160.                     else
  161.                         newItem = new QTableWidgetItem("");
  162.                     printTable->setItem(iRow + 1,ic + 1,newItem);
  163.                 }
  164.                 else
  165.                 {
  166.                     if (view->item(ir,ic))
  167.                         newItem->setText(view->item(ir,ic)->text());
  168.                     else
  169.                         newItem->setText("");
  170.                 }
  171.             }
  172.             iRow++;
  173.         }
  174.         qreal ioffx = (area.width() - totalWidth)/2;
  175.         qreal ioffy = 50;
  176.         if (ipage == 0)
  177.         {
  178.             ioffy = 500;
  179.             QwtPlotPrintFilter filter;
  180.             int options = QwtPlotPrintFilter::PrintAll;
  181.             options &= ~QwtPlotPrintFilter::PrintBackground;
  182.             options |= QwtPlotPrintFilter::PrintFrameWithScales;
  183.             filter.setOptions(options);
  184.             d_plot->print(&painter,QRect(50,65,650,400),filter);
  185.         }
  186.         rows = printTable->rowCount();
  187.         iRow = 1;
  188.         for(int ir = startRow[ipage] ; ir <= endRow[ipage] ; ir++)  //ir变量用来标识当前打印的是哪些行,设置当前打印页的首列序号
  189.         {
  190.             QTableWidgetItem *newItem = printTable->item(iRow,0);
  191.             if (!newItem)
  192.             {
  193.                 if (view->verticalHeaderItem(ir))
  194.                     newItem = new QTableWidgetItem(view->verticalHeaderItem(ir)->text());
  195.                 else
  196.                     newItem = new QTableWidgetItem(QString::number(iRow));
  197.                 printTable->setItem(iRow,0,newItem);
  198.             }
  199.             else
  200.             {
  201.                 if (view->verticalHeaderItem(ir))
  202.                     newItem->setText(view->verticalHeaderItem(ir)->text());
  203.                 else
  204.                     newItem->setText(QString::number(iRow));
  205.             }
  206.             iRow ++;
  207.         }
  208.         QPointF offPt(20,ioffy);  //20表示边框的空格
  209.          for (int r = 0; r < rows; r++)
  210.         {
  211.             QRect rt1,rt2;
  212.             QModelIndex idx1 = printTable->model()->index(r,0);
  213.             QModelIndex idx2 = printTable->model()->index(r,cols);
  214.             rt1 = printTable->visualRect(idx1);
  215.             rt2 = printTable->visualRect(idx2);
  216.             painter.drawLine( (rt1.bottomLeft() + offPt) , (rt2.bottomRight() + offPt) );
  217.             if (r == 0)
  218.             {
  219.                 painter.drawLine( (rt1.topLeft() + offPt) , (rt2.topRight() + offPt) );
  220.             }
  221.         }
  222.         for (int c = 0; c < cols + 1; c++)
  223.         {
  224.             QRect rt1,rt2;
  225.             QModelIndex idx1 = printTable->model()->index(0,c);
  226.             QModelIndex idx2 = printTable->model()->index(rows - 1,c);
  227.             rt1 = printTable->visualRect(idx1);
  228.             rt2 = printTable->visualRect(idx2);
  229.             painter.drawLine( (rt1.topLeft() + offPt) , (rt2.bottomLeft() + offPt) );
  230.             if (c == cols)
  231.             {
  232.                 painter.drawLine( (rt1.topRight() + offPt) , (rt2.bottomRight() + offPt) );
  233.             }
  234.         }
  235.         for (int r = 0; r < rows; r++)
  236.         {
  237.             irowcount ++;
  238.             for(int c = 0; c < cols  + 1; c++)
  239.             {
  240.                 QModelIndex idx = printTable->model()->index(r,c);
  241.                 option.rect = printTable->visualRect(idx);
  242.                 if (printTable->item(r,c))
  243.                 {
  244.                     QRectF rt(option.rect.left() + 3,option.rect.top(),option.rect.width(),option.rect.height());
  245.                     rt = rt.translated(offPt);
  246.                     if (r != 0 && c == 0)
  247.                     {
  248.                         painter.drawText(rt,Qt::AlignCenter,QString("%1").arg(irowcount));
  249.                     }
  250.                     else
  251.                     {
  252.                         if (r == 0)
  253.                         {
  254.                             painter.drawText(rt,Qt::AlignCenter,printTable->item(r,c)->text());
  255.                         }
  256.                         else
  257.                         {
  258.                             painter.drawText(rt,Qt::AlignVCenter,printTable->item(r,c)->text());
  259.                         }
  260.                     }
  261.                 }
  262.             }
  263.         }
  264.         //ipage
  265.         if (ipage == 0)  //设置标题
  266.         {
  267.             QRectF rttt(area.left(),area.top(),area.width(),50);
  268.             painter.drawText(rttt,Qt::AlignCenter,stitile);
  269.         }
  270.         QRectF rttt(area.left(),area.bottom() - 65,area.width(),25);
  271.         painter.drawText(rttt,Qt::AlignCenter,QString::number(ipage + 1));
  272.         if (ipage < startRow.size() - 1)
  273.         {
  274.             printer->newPage();
  275.             irowcount--;
  276.         }
  277.     }
  278.     painter.end();
  279. }
上海欢迎您
快速回复
限100 字节
 
上一个 下一个