PrintAPI.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #pragma execution_character_set("utf-8")
  2. #include "PrintAPI.h"
  3. #include <QtPrintSupport/QPrintPreviewDialog>
  4. #include <QApplication>
  5. #include <QDesktopWidget>
  6. #include <QTextDocument>
  7. PrintAPI *PrintAPI::_instance = 0;
  8. PrintAPI::PrintAPI(QObject *parent) : QObject(parent)
  9. {
  10. }
  11. void PrintAPI::PrintA4(QString title, QString subTitle, QList<QString> columnNames, QList<int> columnWidths, QStringList content, bool landscape, bool check, QPrinter::PageSize pageSize)
  12. {
  13. //计算行数列数
  14. int columnCount = columnNames.count();
  15. int rowCount = content.count();
  16. //清空原有数据,确保每次都是新的数据
  17. html.clear();
  18. //表格开始
  19. html.append("<table border='0.5' cellspacing='0' cellpadding='3'>");
  20. //标题占一行,居中显示
  21. if (title.length() > 0)
  22. {
  23. html.append(QString("<tr><td align='center' style='vertical-align:middle;font-weight:bold;' colspan='%1'>").arg(columnCount));
  24. html.append(title);
  25. html.append("</td></tr>");
  26. }
  27. //副标题占一行,左对齐显示
  28. if (subTitle.length() > 0)
  29. {
  30. html.append(QString("<tr><td align='left' style='vertical-align:middle;' colspan='%1'>").arg(columnCount));
  31. html.append(subTitle);
  32. html.append("</td></tr>");
  33. }
  34. //循环写入字段名,字段名占一行,居中显示
  35. if (columnCount > 0)
  36. {
  37. html.append("<tr>");
  38. for (int i = 0; i < columnCount; i++)
  39. {
  40. html.append(QString("<td width='%1' bgcolor='lightgray' align='center' style='vertical-align:middle;'>").arg(columnWidths.at(i)));
  41. html.append(columnNames.at(i));
  42. html.append("</td>");
  43. }
  44. html.append("</tr>");
  45. }
  46. //循环一行行构建数据
  47. for (int i = 0; i < rowCount; i++)
  48. {
  49. QStringList value = content.at(i).split(";");
  50. html.append("<tr>");
  51. if (check)
  52. {
  53. if (value.at(value.count() - 1) == "历史记录")
  54. {
  55. for (int j = 0; j < columnCount; j++)
  56. {
  57. html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>"
  58. "<font color='red'>").arg(columnWidths.at(j)));
  59. html.append(value.at(j));
  60. html.append("</font></td>");
  61. }
  62. }
  63. else
  64. {
  65. for (int j = 0; j < columnCount; j++)
  66. {
  67. html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>").arg(columnWidths.at(j)));
  68. html.append(value.at(j));
  69. html.append("</td>");
  70. }
  71. }
  72. }
  73. else
  74. {
  75. for (int j = 0; j < columnCount; j++)
  76. {
  77. html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>").arg(columnWidths.at(j)));
  78. html.append(value.at(j));
  79. html.append("</td>");
  80. }
  81. }
  82. html.append("</tr>");
  83. }
  84. html.append("</table>");
  85. //调用打印机打印
  86. QPrinter printer;
  87. //设置输出格式
  88. printer.setOutputFormat(QPrinter::NativeFormat);
  89. //设置纸张规格
  90. printer.setPageSize(pageSize);
  91. //设置横向纵向及页边距
  92. if (landscape)
  93. {
  94. printer.setOrientation(QPrinter::Landscape);
  95. printer.setPageMargins(10, 10, 10, 12, QPrinter::Millimeter);
  96. }
  97. else
  98. {
  99. printer.setOrientation(QPrinter::Portrait);
  100. printer.setPageMargins(10, 10, 10, 16, QPrinter::Millimeter);
  101. }
  102. QPrintPreviewDialog preview(&printer);
  103. preview.setWindowTitle("打印预览");
  104. connect(&preview, SIGNAL(paintRequested(QPrinter *)), this, SLOT(printView(QPrinter *)));
  105. preview.setGeometry(qApp->desktop()->availableGeometry());
  106. preview.exec();
  107. }
  108. void PrintAPI::PrintA4(QString title, QList<QString> columnNames, QList<int> columnWidths, QStringList subTitle1, QStringList subTitle2, QStringList content, bool landscape, bool check, QPrinter::PageSize pageSize)
  109. {
  110. //计算列数
  111. int columnCount = columnNames.count();
  112. //清空原有数据,确保每次都是新的数据
  113. html.clear();
  114. //表格开始
  115. html.append("<table border='0.5' cellspacing='0' cellpadding='3'>");
  116. //标题占一行,居中显示
  117. if (title.length() > 0)
  118. {
  119. html.append(QString("<tr><td align='center' style='vertical-align:middle;font-weight:bold;' colspan='%1'>").arg(columnCount));
  120. html.append(title);
  121. html.append("</td></tr>");
  122. }
  123. //循环添加副标题/字段名/内容
  124. int count = content.count();
  125. for (int i = 0; i < count; i++)
  126. {
  127. //加个空行隔开
  128. html.append(QString("<tr><td colspan='%1'>").arg(columnCount));
  129. html.append("</td></tr>");
  130. //副标题1
  131. if (subTitle1.count() > 0 && subTitle1.count() > i)
  132. {
  133. if (subTitle1.at(i).length() > 0)
  134. {
  135. html.append(QString("<tr><td align='left' style='vertical-align:middle;' colspan='%1'>").arg(columnCount));
  136. html.append(subTitle1.at(i));
  137. html.append("</td></tr>");
  138. }
  139. }
  140. //副标题2
  141. if (subTitle2.count() > 0 && subTitle2.count() > i)
  142. {
  143. if (subTitle2.at(i).length() > 0)
  144. {
  145. html.append(QString("<tr><td align='left' style='vertical-align:middle;' colspan='%1'>").arg(columnCount));
  146. html.append(subTitle2.at(i));
  147. html.append("</td></tr>");
  148. }
  149. }
  150. //逐个添加字段名称
  151. if (columnCount > 0)
  152. {
  153. html.append("<tr>");
  154. for (int i = 0; i < columnCount; i++)
  155. {
  156. html.append(QString("<td width='%1' bgcolor='lightgray' align='center' style='vertical-align:middle;'>").arg(columnWidths.at(i)));
  157. html.append(columnNames.at(i));
  158. html.append("</td>");
  159. }
  160. html.append("</tr>");
  161. }
  162. QStringList list = content.at(i).split(";");
  163. //逐个添加数据
  164. int rowCount = list.count();
  165. for (int j = 0; j < rowCount; j++)
  166. {
  167. html.append("<tr>");
  168. QString temp = list.at(j);
  169. QStringList value = temp.split("|");
  170. int valueCount = value.count();
  171. if (check)
  172. {
  173. //如果是历史记录则文字红色
  174. if (value.at(valueCount - 1) == "1")
  175. {
  176. for (int k = 0; k < valueCount - 1; k++)
  177. {
  178. html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>"
  179. "<font color='red'>").arg(columnWidths.at(k)));
  180. html.append(value.at(k));
  181. html.append("</font></td>");
  182. }
  183. }
  184. else
  185. {
  186. for (int k = 0; k < valueCount - 1; k++)
  187. {
  188. html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>").arg(columnWidths.at(k)));
  189. html.append(value.at(k));
  190. html.append("</td>");
  191. }
  192. }
  193. }
  194. else
  195. {
  196. for (int k = 0; k < valueCount; k++)
  197. {
  198. html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>").arg(columnWidths.at(k)));
  199. html.append(value.at(k));
  200. html.append("</td>");
  201. }
  202. }
  203. html.append("</tr>");
  204. }
  205. }
  206. html.append("</table>");
  207. //调用打印机打印
  208. QPrinter printer;
  209. //设置输出格式
  210. printer.setOutputFormat(QPrinter::NativeFormat);
  211. //设置纸张规格
  212. printer.setPageSize(pageSize);
  213. //设置横向纵向及页边距
  214. if (landscape)
  215. {
  216. printer.setOrientation(QPrinter::Landscape);
  217. printer.setPageMargins(10, 10, 10, 12, QPrinter::Millimeter);
  218. }
  219. else
  220. {
  221. printer.setOrientation(QPrinter::Portrait);
  222. printer.setPageMargins(10, 10, 10, 16, QPrinter::Millimeter);
  223. }
  224. QPrintPreviewDialog preview(&printer);
  225. preview.setWindowTitle("打印预览");
  226. connect(&preview, SIGNAL(paintRequested(QPrinter *)), this, SLOT(printView(QPrinter *)));
  227. preview.setGeometry(qApp->desktop()->availableGeometry());
  228. preview.exec();
  229. }
  230. void PrintAPI::printReport(ReportData reportdata, QImage image)
  231. {
  232. QString style = "style='font-size:18px;'";
  233. html << "<center><p><font size='12'>电缆结构检验报告</font></p></center>";
  234. html << "<table border='0.0' cellspacing='0' cellpadding='6'>";
  235. QString index = QString("报告编号: %1").arg(reportdata.reportindex);
  236. QString time = QString("检验日期: %1").arg(reportdata.reportdate);
  237. html << "<tr>";
  238. html << QString("<td width='780' %1>%2</td>").arg(style).arg(index);
  239. html << QString("<td width='360' %1>%2</td>").arg(style).arg(time);
  240. html << "</tr>";
  241. html << "</table>";
  242. html << "<table border='0.5' cellspacing='0' cellpadding='5'>";
  243. html << "<tr>";
  244. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("设备名称");
  245. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.devicename);
  246. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("环境温度");
  247. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.temperature);
  248. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("设备状态");
  249. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.devicestate);
  250. html << "</tr>";
  251. html << "<tr>";
  252. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("试样编号");
  253. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.tempindex);
  254. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("试样名称");
  255. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.tempname);
  256. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("电缆颜色");
  257. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.cablecolor);
  258. html << "</tr>";
  259. html << "<tr>";
  260. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("规格型号");
  261. html << QString("<td width='480' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.models);
  262. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("数量(米)");
  263. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg(reportdata.count);
  264. html << "</tr>";
  265. html << "</table>";
  266. html << "<table border='0.5' cellspacing='0' cellpadding='5'>";
  267. html << "<tr>";
  268. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("送检单位");
  269. html << QString("<td width='800' align = 'center' colspan='6' %1>%2</td>").arg(style).arg(reportdata.manufacturer);
  270. html << "</tr>";
  271. html << "<tr>";
  272. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("生产厂家");
  273. html << QString("<td width='384' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.submissionunit);
  274. html << QString("<td width='256' align = 'center' %1>%2</td>").arg(style).arg("生产日期");
  275. html << QString("<td width='360' align = 'center' colspan='2' %1>%2</td>").arg(style).arg(reportdata.productiondate);
  276. html << "</tr>";
  277. html << "<tr>";
  278. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("测量点数据(mm)");
  279. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.Data1);
  280. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.Data2);
  281. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.Data3);
  282. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.Data4);
  283. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.Data5);
  284. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.Data6);
  285. html << "</tr>";
  286. html << "<tr>";
  287. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("外形尺寸(mm)");
  288. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("最大外径");
  289. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.MaxRadius);
  290. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("最小外径");
  291. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.MinRadius);
  292. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("平均外径");
  293. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg(reportdata.meanRadius);
  294. html << "</tr>";
  295. html << "<tr>";
  296. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("最薄点(mm)");
  297. html << QString("<td width='266' align = 'center' colspan='2' %1>%2</td>").arg(style).arg(reportdata.thinnestpoint);
  298. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("平均厚度(mm)");
  299. html << QString("<td width='400' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.meanhoudu);
  300. html << "</tr>";
  301. html << "<tr>";
  302. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("最大点(mm)");
  303. html << QString("<td width='266' align = 'center' colspan='2' %1>%2</td>").arg(style).arg(reportdata.maxpoint);
  304. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("同心度%");
  305. html << QString("<td width='400' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.tongxindu);
  306. html << "</tr>";
  307. html << "<tr>";
  308. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("偏心度%");
  309. html << QString("<td width='266' align = 'center' colspan='2' %1>%2</td>").arg(style).arg(reportdata.pianxindu);
  310. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("截面积(mm²)");
  311. html << QString("<td width='400' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.jiemianji);
  312. html << "</tr>";
  313. html << "<tr>";
  314. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("椭圆度%");
  315. html << QString("<td width='800' align = 'center' colspan='6' %1>%2</td>").arg(style).arg(reportdata.tuoyuandu);
  316. html << "</tr>";
  317. html << "</table>";
  318. html << "<center><p><font size='12'>整体指标</font></p></center>";
  319. html << "<table border='0.5' cellspacing='0' cellpadding='5'>";
  320. html << "<tr>";
  321. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("平均厚度");
  322. html << QString("<td width='266' align = 'center' colspan='2' %1>%2</td>").arg(style).arg(reportdata.meanhouduall);
  323. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("同心度%");
  324. html << QString("<td width='400' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.tongxinduall);
  325. html << "</tr>";
  326. html << "<tr>";
  327. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("最大厚度");
  328. html << QString("<td width='266' align = 'center' colspan='2' %1>%2</td>").arg(style).arg(reportdata.maxhouduall);
  329. html << QString("<td width='134' align = 'center' %1>%2</td>").arg(style).arg("偏心度%");
  330. html << QString("<td width='400' align = 'center' colspan='3' %1>%2</td>").arg(style).arg(reportdata.pianxinduall);
  331. html << "</tr>";
  332. html << "<tr>";
  333. html << QString("<td width='160' align = 'center' %1>%2</td>").arg(style).arg("内空截面积(mm²)");
  334. html << QString("<td width='800' align = 'center' colspan='6' %1>%2</td>").arg(style).arg(reportdata.jiemianjiall);
  335. html << "</tr>";
  336. html << "<tr>";
  337. image = image.scaled(300, image.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
  338. image.save("out.jpg", "jpg");
  339. style = "style='vertical-align:middle;'";
  340. html << QString("<td width='180' style='font-size:18px' align ='center' %1>%2</td>").arg(style).arg("备注");
  341. html << QString("<td width='1080' align='center' colspan='6' %1><img src='%2'></td>").arg(style).arg("out.jpg");
  342. html << "</tr>";
  343. html << "</table>";
  344. html << "<p style='font-size:18px'>检验员: 恋上小鹿的叶子</p>";
  345. //调用打印机打印
  346. QPrinter printer;
  347. //设置输出格式
  348. printer.setOutputFormat(QPrinter::NativeFormat);
  349. //设置纸张规格
  350. printer.setPageSize(QPrinter::A4);
  351. //设置横向纵向及页边距
  352. printer.setOrientation(QPrinter::Landscape);
  353. printer.setPageMargins(10, 10, 10, 10, QPrinter::Millimeter);
  354. QPrintPreviewDialog preview(&printer);
  355. preview.setWindowTitle("打印预览");
  356. preview.setWindowFlags(Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);
  357. connect(&preview, SIGNAL(paintRequested(QPrinter *)), this, SLOT(printView(QPrinter *)));
  358. preview.showMaximized();
  359. preview.exec();
  360. }
  361. void PrintAPI::printView(QPrinter *printer)
  362. {
  363. QTextDocument txt;
  364. txt.setHtml(html.join(""));
  365. txt.print(printer);
  366. }