standardAnswer.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "standardAnswer.h"
  2. #include "ui_standardAnswer.h"
  3. #include "CAppInfo.h"
  4. #include "logproc.h"
  5. #include "CCommonTools.h"
  6. standardAnswer::standardAnswer(CSubQuestionStruct &sqs, QWidget *parent) :
  7. CBaseWidget(parent),
  8. ui(new Ui::standardAnswer), m_sqs(sqs)
  9. {
  10. ui->setupUi(this);
  11. setStyleSheet(g_appInfoPtr->m_sQssStr);
  12. m_bShowAnswer = false;
  13. }
  14. standardAnswer::~standardAnswer()
  15. {
  16. delete ui;
  17. }
  18. void standardAnswer::initAnswer()
  19. {
  20. ui->txtb_sa_answer->clear();
  21. QTextCursor cursor = ui->txtb_sa_answer->textCursor();
  22. QTextCharFormat fmt;
  23. QFont font;
  24. font.setFamily("Microsoft YaHei");
  25. font.setPixelSize(14);
  26. font.setWeight(QFont::Medium);
  27. int nRA = m_sqs.vRightAnswer.size();
  28. QString sRightAnswer = "";
  29. for (int ira = 0; ira < nRA; ++ira)
  30. {
  31. if (!m_sqs.vRightAnswer[ira].isEmpty())
  32. {
  33. Json::Reader reader;
  34. Json::Value m_jBody = Json::Value::null;
  35. if (!reader.parse(m_sqs.vRightAnswer[ira].toStdString(), m_jBody))
  36. {
  37. // ShowMsg(QString::fromLocal8Bit("解析题干出错!"), g_appInfoPtr->m_answerWidget);
  38. myDebug() << QString::fromLocal8Bit("解析题干出错!");
  39. }
  40. int nSize = m_jBody["sections"].size();
  41. for (int i = 0; i < nSize; i++)
  42. {
  43. Json::Value blocks = m_jBody["sections"][i];
  44. for (int j = 0; j < (int)blocks["blocks"].size(); j++)
  45. {
  46. if (blocks["blocks"][j]["type"].asString() == "text")
  47. {
  48. QTextCharFormat fmt;
  49. QFont font;
  50. font.setFamily("Microsoft YaHei");
  51. font.setPixelSize(g_appInfoPtr->m_fRate * 16);
  52. font.setWeight(QFont::Medium);
  53. if (blocks["blocks"][j].isMember("param"))
  54. {
  55. if (blocks["blocks"][j]["param"].isMember("font"))
  56. {
  57. if (blocks["blocks"][j]["param"]["font"].isMember("bold"))
  58. {
  59. font.setBold(blocks["blocks"][j]["param"]["font"]["bold"].asBool());
  60. }
  61. if (blocks["blocks"][j]["param"]["font"].isMember("italic"))
  62. {
  63. bool bstyle = blocks["blocks"][j]["param"]["font"]["italic"].asBool();
  64. font.setItalic(bstyle);
  65. }
  66. if (blocks["blocks"][j]["param"]["font"].isMember("underline"))
  67. {
  68. font.setUnderline(blocks["blocks"][j]["param"]["font"]["underline"].asBool());
  69. }
  70. if (blocks["blocks"][j]["param"]["font"].isMember("strikeOut"))
  71. {
  72. font.setStrikeOut(blocks["blocks"][j]["param"]["font"]["strikeOut"].asBool());
  73. }
  74. if (blocks["blocks"][j]["param"]["font"].isMember("size"))
  75. {
  76. font.setPixelSize(blocks["blocks"][j]["param"]["font"]["size"].asInt());
  77. }
  78. if (blocks["blocks"][j]["param"]["font"].isMember("name"))
  79. {
  80. font.setFamily(blocks["blocks"][j]["param"]["font"]["name"].asString().c_str());
  81. }
  82. }
  83. }
  84. fmt.setFont(font);
  85. QString sTextStr = blocks["blocks"][j]["value"].asString().c_str();
  86. fmt.setFont(font);
  87. if (m_sqs.sQuestionType == QUESTION_TYPE::SingleChoice ||
  88. m_sqs.sQuestionType == QUESTION_TYPE::MultipleChoice)
  89. {
  90. std::vector<int>::iterator result = std::find(m_sqs.voptionPermutation.begin(), m_sqs.voptionPermutation.end(), sTextStr.toInt());
  91. sRightAnswer = QChar('A' + *result);
  92. cursor.insertText(sRightAnswer);
  93. }
  94. else if (m_sqs.sQuestionType == QUESTION_TYPE::TrueOrFalse)
  95. {
  96. if (sTextStr == "true")
  97. {
  98. cursor.insertText(QString::fromLocal8Bit("正确"));
  99. }
  100. else
  101. {
  102. cursor.insertText(QString::fromLocal8Bit("错误"));
  103. }
  104. }
  105. else if (m_sqs.sQuestionType == QUESTION_TYPE::FillUp || m_sqs.sQuestionType == QUESTION_TYPE::Essay)
  106. {
  107. cursor.insertText(sTextStr, fmt);
  108. }
  109. }
  110. else if (blocks["blocks"][j]["type"].asString() == "image")
  111. {
  112. QString sImage = blocks["blocks"][j]["value"].asString().c_str();
  113. if(!(sImage.startsWith("http") || sImage.startsWith("data:image")))
  114. {
  115. sImage = QString("temp/paper/attachment/") + sImage;
  116. }
  117. if(sImage.startsWith("data:image"))
  118. {
  119. QImage img;
  120. img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
  121. if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
  122. !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
  123. {
  124. img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
  125. QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
  126. Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  127. }
  128. cursor.insertImage(img);
  129. }
  130. else
  131. {
  132. QImage img(sImage);
  133. if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
  134. !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
  135. {
  136. img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
  137. QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
  138. Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  139. }
  140. cursor.insertImage(img);
  141. }
  142. // QString strHtml = "";
  143. // if (blocks["blocks"][j]["param"].isMember("width"))
  144. // {
  145. // strHtml = QString("<img src=\"%1\" height=\"%2\" width=\"%3\" align=\"bottom\" />")
  146. // .arg(blocks["blocks"][j]["value"].asString().c_str())
  147. // .arg(blocks["blocks"][j]["param"]["height"].asString().c_str())
  148. // .arg(blocks["blocks"][j]["param"]["width"].asString().c_str());
  149. // }
  150. // else
  151. // {
  152. // strHtml = "<img src=\"" + QString::fromLocal8Bit(blocks["blocks"][j]["value"].asString().c_str()) + "\" align=\"bottom\" />";
  153. // }
  154. // cursor.insertHtml(strHtml);
  155. }
  156. }
  157. if (i < nSize - 1)
  158. {
  159. cursor.insertText("\n");
  160. }
  161. }
  162. }
  163. }
  164. ui->txtb_sa_answer->adjustSize();
  165. ui->txtb_sa_answer->selectAll();
  166. ui->txtb_sa_answer->setAlignment(Qt::AlignJustify);
  167. cursor.movePosition(QTextCursor::End);
  168. ui->txtb_sa_answer->setTextCursor(cursor);
  169. }
  170. int standardAnswer::setUI(const int nWidth)
  171. {
  172. ui->btn_sa_showAnswer->setGeometry(g_appInfoPtr->m_fRate*30, g_appInfoPtr->m_fRate*20, g_appInfoPtr->m_fRate*72, g_appInfoPtr->m_fRate*24);
  173. ui->label_sa_arrow->setGeometry(ui->btn_sa_showAnswer->x() + ui->btn_sa_showAnswer->width() - g_appInfoPtr->m_fRate*4,
  174. ui->btn_sa_showAnswer->y() + (ui->btn_sa_showAnswer->height())/2,
  175. g_appInfoPtr->m_fRate*8, g_appInfoPtr->m_fRate*4);
  176. ui->label_sa_answer->adjustSize();
  177. ui->label_sa_answer->setGeometry(0, 0,
  178. ui->label_sa_answer->width(), ui->label_sa_answer->height());
  179. ui->txtb_sa_answer->setGeometry(ui->label_sa_answer->x() + ui->label_sa_answer->width(), ui->label_sa_answer->y() - g_appInfoPtr->m_fRate *3,
  180. nWidth - ui->label_sa_answer->width(), 300);
  181. ui->txtb_sa_answer->setFixedWidth(nWidth - ui->label_sa_answer->width());
  182. initAnswer();
  183. int nHeight = ui->txtb_sa_answer->document()->size().height() + g_appInfoPtr->m_fRate*5;
  184. ui->txtb_sa_answer->setFixedHeight(nHeight);
  185. ui->widget_sa_answer->setGeometry(ui->btn_sa_showAnswer->x() + g_appInfoPtr->m_fRate*5, ui->btn_sa_showAnswer->y() + ui->btn_sa_showAnswer->height() + g_appInfoPtr->m_fRate * g_appInfoPtr->m_fRate*10,
  186. nWidth, ui->txtb_sa_answer->height());
  187. ui->widget_sa_answer->setVisible(false);
  188. setGeometry(0, 0, nWidth, ui->widget_sa_answer->y() + ui->widget_sa_answer->height() + g_appInfoPtr->m_fRate*20);
  189. return height();
  190. }
  191. void standardAnswer::on_btn_sa_showAnswer_clicked()
  192. {
  193. if(!m_bShowAnswer)
  194. {
  195. setFixedHeight(ui->widget_sa_answer->y() + ui->widget_sa_answer->height() + g_appInfoPtr->m_fRate * 20);
  196. m_bShowAnswer = true;
  197. }
  198. else
  199. {
  200. setFixedHeight(ui->btn_sa_showAnswer->y() + ui->btn_sa_showAnswer->height() + g_appInfoPtr->m_fRate * 20);
  201. m_bShowAnswer = false;
  202. }
  203. ui->widget_sa_answer->setVisible(m_bShowAnswer);
  204. emit heightChange(height());
  205. }
  206. int standardAnswer::widgetType()
  207. {
  208. return wt_standardAnswer;
  209. }