我已经编写了一个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(" "));
}
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()还是应该使用完全不同的方法?
答案 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;
}`
这可能不是最佳答案,但是到目前为止,它仍然有效。