使用QT5如何打印QTablewidget并缩放表格以适合A4纸的一侧

时间:2019-06-14 21:57:41

标签: html printing qt5

我已经编写了一个QT5应用程序,该应用程序根据各种输入来创建每月轮转/时间表。它生成一个csv文件,我可以使用excel读取和打印该文件。我可以使用libreoffice将其打印到一张A4纸上。 但是,我真正想做的是使用qt将表直接打印到打印机。

恐怕我对如何最好地实现这一目标感到困惑。我已经将html与QTextDocument一起使用,以成功打印出轮转/时间表。但是,结果以两页而不是一页结束。我以横向模式将其打印出来。我认为最好将文档的高度缩小到适合一页的大小。

void ViewEditRotaDialog::m_printButtonSlot()
{
  QString strStream;
  QTextStream out(&strStream);

  const int rowCount = m_tableWidget->rowCount();
  const int columnCount = m_tableWidget->columnCount();

  out <<  "<html>\n"
  "<head>\n"
  "<meta Content=\"Text/html; charset=Windows-1251\">\n"
  <<  QString("<title>%1</title>\n").arg("ROTA")
  <<  "</head>\n"
  "<body bgcolor=#ffffff link=#5000A0>\n"
  "<table border=1 cellspacing=0 cellpadding=2>\n";

  // headers
  out << "<thead><tr bgcolor=#f0f0f0>";
  for (int column = 0; column < columnCount; column++)
    out << QString("<th>%1</th>").
        arg(m_tableWidget->horizontalHeaderItem(column)->text());
  out << "</tr></thead>\n";

  // data table
  for (int row = 0; row < rowCount; row++)
  {
    out << "<tr>";
    for (int column = 0; column < columnCount; column++)
    {
      QString data 
      m_tableWidget->item(row,column)->text().simplified();
      out << QString("<td bkcolor=0>%1</td>").
                 arg((!data.isEmpty()) ? data :  QString("&nbsp;"));
    }
    out << "</tr>\n";
  }
  out <<  "</table>\n"
            "</body>\n"
            "</html>\n";

  QTextDocument *document = new QTextDocument();
  document->setHtml(strStream);
  QPrinter printer(QPrinter::HighResolution);
  printer.setOrientation(QPrinter::Landscape);
  printer.setPageMargins(0.1,0.1,0.1,0.1,QPrinter::Millimeter);
  printer.setFullPage(true);

  QPrintDialog *dialog = new QPrintDialog(&printer, NULL);
  if (dialog->exec() != QDialog::Accepted)
    return;

  document->print(&printer);
  delete document;
}

我看过其他使用QPainter并尝试缩放输出的示例。 我应该这样做并使用drawcontents()还是应该使用完全不同的方法?

1 个答案:

答案 0 :(得分:0)

我决定尝试使用painter和drawContents()。我很高兴我可以用最少的精力做我需要的事情。我尚未完全了解其工作原理的详细信息,但稍后将对其进行详细研究。可能我需要对此进行增强,但是它对于我所需要的看起来非常好。简而言之,看起来我只需要更改比例即可使其达到我的要求。以前从未使用过QT进行打印,我真的不知道如何最好地做到这一点。但是我对结果感到满意。

我替换了下面的代码     QTextDocument *document = new QTextDocument();

`
document->setHtml(strStream);

QPrinter printer(QPrinter::HighResolution);
printer.setPaperSize(QPrinter::A4);
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(0.1,0.1,0.1,0.1,QPrinter::Millimeter);
printer.setFullPage(true);

QPrintDialog *dialog = new QPrintDialog(&printer, NULL);
if (dialog->exec() != QDialog::Accepted)
  return;

QPainter painter;
painter.begin(&printer);

double xscale = printer.pageRect().width() / document->size().width();
double yscale = printer.pageRect().height() / document->size().height();
painter.translate(printer.paperRect().x() + printer.pageRect().width() / 2,
                printer.paperRect().y() + printer.pageRect().height() / 2);
painter.scale(xscale, yscale);
painter.translate(-document->size().width() / 2,
                                     -document->size().height() / 2);

document->drawContents(&painter);
painter.end();
delete document;
}`

这可能不是最佳答案,但是到目前为止,它仍然有效。