Используя QT5, как я могу напечатать QTablewidget и масштабировать таблицу, чтобы уместить ее на одной стороне листа А4 - PullRequest
0 голосов
/ 15 июня 2019

Я написал приложение QT5, которое создает ежемесячную ротацию / расписание на основе различных входных данных. Он генерирует CSV-файл, который я могу использовать Excel для чтения и печати. Я могу использовать libreoffice, чтобы напечатать это на одном листе формата А4. Однако я действительно хотел бы использовать 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 голосов
/ 16 июня 2019

Я решил поиграть с использованием 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;
}`

Возможно, это не лучший ответ, но пока он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...