questionBody.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #include "questionBody.h"
  2. #include "ui_questionBody.h"
  3. #include <QFile>
  4. //#include "PaperDef.h"
  5. #include "CAppInfo.h"
  6. #include "CCommonTools.h"
  7. questionBody::questionBody(const Json::Value jBody, QWidget *parent) :
  8. CBaseWidget(parent),
  9. ui(new Ui::questionBody)
  10. {
  11. ui->setupUi(this);
  12. setAttribute(Qt::WA_DeleteOnClose);
  13. m_jBody = jBody;
  14. setStyleSheet(g_appInfoPtr->m_sQssStr);
  15. }
  16. questionBody::~questionBody()
  17. {
  18. delete ui;
  19. }
  20. int questionBody::setUI(const int nWidth, const int nNum)
  21. {
  22. int nNumber = nNum;
  23. setGeometry(0, 0, nWidth, g_appInfoPtr->m_fRate*300);
  24. ui->tb_questionBody->setGeometry(0, 0, nWidth, g_appInfoPtr->m_fRate*300);
  25. ui->tb_questionBody->setFixedWidth(nWidth);
  26. QTextCursor cursor = ui->tb_questionBody->textCursor();
  27. QTextBlockFormat textStyleFormat = cursor.blockFormat();
  28. // textStyleFormat.setTextIndent(26); //首行缩进
  29. textStyleFormat.setLineHeight(g_appInfoPtr->m_fRate*5, QTextBlockFormat::LineDistanceHeight);
  30. cursor.setBlockFormat(textStyleFormat);
  31. int nSize = m_jBody["sections"].size();
  32. for(int i = 0; i < nSize; i ++)
  33. {
  34. Json::Value blocks = m_jBody["sections"][i];
  35. for(int j = 0; j < (int)blocks["blocks"].size(); j++)
  36. {
  37. if(blocks["blocks"][j]["type"].asString() == "text")
  38. {
  39. QTextCharFormat fmt;
  40. QFont font;
  41. font.setFamily("Microsoft YaHei");
  42. font.setPixelSize(g_appInfoPtr->m_fRate*16);
  43. font.setWeight(QFont::Medium);
  44. if(blocks["blocks"][j].isMember("param"))
  45. {
  46. if(blocks["blocks"][j]["param"].isMember("font"))
  47. {
  48. if(blocks["blocks"][j]["param"]["font"].isMember("bold"))
  49. {
  50. font.setBold(blocks["blocks"][j]["param"]["font"]["bold"].asBool());
  51. }
  52. if(blocks["blocks"][j]["param"]["font"].isMember("italic"))
  53. {
  54. bool bstyle = blocks["blocks"][j]["param"]["font"]["italic"].asBool();
  55. font.setItalic(bstyle);
  56. }
  57. if(blocks["blocks"][j]["param"]["font"].isMember("underline"))
  58. {
  59. font.setUnderline(blocks["blocks"][j]["param"]["font"]["underline"].asBool());
  60. }
  61. if(blocks["blocks"][j]["param"]["font"].isMember("strikeOut"))
  62. {
  63. font.setStrikeOut(blocks["blocks"][j]["param"]["font"]["strikeOut"].asBool());
  64. }
  65. if(blocks["blocks"][j]["param"]["font"].isMember("size"))
  66. {
  67. font.setPixelSize(blocks["blocks"][j]["param"]["font"]["size"].asInt());
  68. }
  69. if(blocks["blocks"][j]["param"]["font"].isMember("name"))
  70. {
  71. font.setFamily(blocks["blocks"][j]["param"]["font"]["name"].asString().c_str());
  72. }
  73. }
  74. }
  75. fmt.setFont(font);
  76. QString sTextStr = blocks["blocks"][j]["value"].asString().c_str();
  77. int nFIndex = sTextStr.indexOf("##");
  78. if(nFIndex >= 0)
  79. {
  80. int nStartIdex = 0;
  81. while((nFIndex = sTextStr.indexOf("##", nStartIdex)) >=0)
  82. {
  83. int nSIndex = sTextStr.indexOf("##", nFIndex + 2);
  84. if(nSIndex >= 0)
  85. {
  86. int nNumLen = nSIndex - nFIndex - 2;
  87. QString sNumber = sTextStr.mid(nFIndex + 2, nNumLen);
  88. if(IsNumber(sNumber))
  89. {
  90. sTextStr.replace(nFIndex + 2, nNumLen, QString::number(nNumber));
  91. nSIndex = nSIndex - nNumLen + QString::number(nNumber).length();
  92. fmt.setFont(font);
  93. cursor.insertText(sTextStr.mid(nStartIdex, nFIndex - nStartIdex), fmt);
  94. QFont font1(font);
  95. font1.setUnderline(true);
  96. QBrush br = fmt.foreground();
  97. fmt.setForeground(QColor(0, 122, 255));
  98. fmt.setFont(font1);
  99. cursor.insertText(" " + QString::number(nNumber) + " ", fmt);
  100. fmt.setForeground(br);
  101. nNumber++;
  102. }
  103. else
  104. {
  105. fmt.setFont(font);
  106. cursor.insertText(sTextStr.mid(nStartIdex, nSIndex + 2- nStartIdex), fmt);
  107. }
  108. nStartIdex = nSIndex + 2;
  109. }
  110. else
  111. {
  112. fmt.setFont(font);
  113. cursor.insertText(sTextStr.mid(nStartIdex, nFIndex + 2- nStartIdex), fmt);
  114. nStartIdex = nFIndex + 2;
  115. }
  116. }
  117. fmt.setFont(font);
  118. cursor.insertText(sTextStr.mid(nStartIdex, sTextStr.length()- nStartIdex), fmt);
  119. }
  120. else
  121. {
  122. fmt.setFont(font);
  123. cursor.insertText(sTextStr, fmt);
  124. }
  125. // cursor.insertText(blocks["blocks"][j]["value"].asString().c_str(), fmt);
  126. }
  127. else if(blocks["blocks"][j]["type"].asString() == "image")
  128. {
  129. QString sImage = blocks["blocks"][j]["value"].asString().c_str();
  130. if(!(sImage.startsWith("http") || sImage.startsWith("data:image")))
  131. {
  132. sImage = QString("temp/paper/attachment/") + sImage;
  133. }
  134. if(sImage.startsWith("data:image"))
  135. {
  136. QImage img;
  137. img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
  138. if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
  139. !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
  140. {
  141. img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
  142. QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
  143. Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  144. }
  145. cursor.insertImage(img);
  146. }
  147. else
  148. {
  149. QImage img(sImage);
  150. if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
  151. !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
  152. {
  153. img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
  154. QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
  155. Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  156. }
  157. cursor.insertImage(img);
  158. }
  159. // QString strHtml = "";
  160. // if(blocks["blocks"][j]["param"].isMember("width"))
  161. // {
  162. // strHtml = QString("<img src=\"%1\" height=\"%2\" width=\"%3\" align=\"bottom\" />")
  163. // .arg(blocks["blocks"][j]["value"].asString().c_str())
  164. // .arg(blocks["blocks"][j]["param"]["height"].asString().c_str())
  165. // .arg(blocks["blocks"][j]["param"]["width"].asString().c_str());
  166. // }
  167. // else
  168. // {
  169. // strHtml = "<img src=\""+QString::fromLocal8Bit(blocks["blocks"][j]["value"].asString().c_str())+"\" align=\"bottom\" />";
  170. // }
  171. // cursor.insertHtml(strHtml);
  172. }
  173. }
  174. if(i < nSize - 1)
  175. {
  176. cursor.insertText("\n");
  177. }
  178. }
  179. ui->tb_questionBody->adjustSize();
  180. ui->tb_questionBody->selectAll();
  181. ui->tb_questionBody->setAlignment(Qt::AlignJustify);
  182. cursor.movePosition(QTextCursor::End);
  183. ui->tb_questionBody->setTextCursor(cursor);
  184. ui->tb_questionBody->setFixedHeight(ui->tb_questionBody->document()->size().height()+5);
  185. setGeometry(0, 0, nWidth, ui->tb_questionBody->y() + ui->tb_questionBody->height() + 10);
  186. return height();
  187. }
  188. bool questionBody::IsNumber(const QString sText)
  189. {
  190. QByteArray ba = sText.toLatin1();
  191. const char *s = ba.data();
  192. bool bret = true;
  193. while(*s)
  194. {
  195. if(*s < '0' || *s > '9')
  196. {
  197. bret = false;
  198. break;
  199. }
  200. s++;
  201. }
  202. return bret;
  203. }
  204. void questionBody::setQuesionNo(const QString sItemNo)
  205. {
  206. QTextCursor cursor = ui->tb_questionBody->textCursor();
  207. QTextCharFormat fmt;
  208. QFont font;
  209. font.setFamily("Microsoft YaHei");
  210. font.setPixelSize(16);
  211. font.setWeight(QFont::Medium);
  212. cursor.insertText(sItemNo, fmt);
  213. fmt.setFont(font);
  214. ui->tb_questionBody->setTextCursor(cursor);
  215. }
  216. int questionBody::widgetType()
  217. {
  218. return wt_questionBody;
  219. }