questionSet.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. #include "questionSet.h"
  2. #include "ui_questionSet.h"
  3. #include <QFile>
  4. #include <QScrollBar>
  5. #include "choiceQuesiton.h"
  6. #include "fillBlank.h"
  7. #include "questionAndAnswer.h"
  8. #include "questionBody.h"
  9. #include "audioPlay.h"
  10. #include "standardAnswer.h"
  11. #include "CAppInfo.h"
  12. #include "logproc.h"
  13. questionSet::questionSet(CQuestionStruct &qs, int nOrder, int nTotalSubQuestion, QWidget *parent) :
  14. QWidget(parent),
  15. ui(new Ui::questionSet), m_qs(qs), m_nOrder(nOrder), m_nTotalSubQuestion(nTotalSubQuestion)
  16. {
  17. ui->setupUi(this);
  18. setAttribute(Qt::WA_DeleteOnClose);
  19. m_pWidgetChangeQuestion = nullptr;
  20. setStyleSheet(g_appInfoPtr->m_sQssStr);
  21. ui->list_question->setVerticalScrollMode(QListWidget::ScrollPerPixel);
  22. ui->list_question->verticalScrollBar()->setSingleStep(g_appInfoPtr->m_fRate * 5);
  23. ui->list_body->setVerticalScrollMode(QListWidget::ScrollPerPixel);
  24. ui->list_body->verticalScrollBar()->setSingleStep(g_appInfoPtr->m_fRate * 5);
  25. }
  26. questionSet::~questionSet()
  27. {
  28. if(m_pWidgetChangeQuestion != nullptr)
  29. {
  30. delete m_pWidgetChangeQuestion;
  31. m_pWidgetChangeQuestion = nullptr;
  32. }
  33. delete ui;
  34. }
  35. void questionSet::setUI(const int nLeft, const int nTop, const int nWidth, const int nHeight)
  36. {
  37. setGeometry(nLeft, nTop, nWidth, nHeight);
  38. ui->label_bigQuesionName->adjustSize();
  39. ui->label_bigQuesionName->setGeometry(g_appInfoPtr->m_fRate*40, 0, ui->label_bigQuesionName->width(), ui->label_bigQuesionName->height());
  40. ui->label_groupProgress->adjustSize();
  41. ui->label_groupProgress->setGeometry(width() - g_appInfoPtr->m_fRate*40*2 - ui->label_groupProgress->width(),
  42. ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() - ui->label_groupProgress->height(),
  43. ui->label_groupProgress->width(), ui->label_groupProgress->height());
  44. int nNameWidth = ui->label_groupProgress->x() - ui->label_bigQuesionName->x() - g_appInfoPtr->m_fRate*20;
  45. int nRowCount = (ui->label_bigQuesionName->width() + nNameWidth - 1)/nNameWidth;
  46. if(nRowCount > 1)
  47. {
  48. ui->label_bigQuesionName->setWordWrap(true);
  49. ui->label_bigQuesionName->setGeometry(g_appInfoPtr->m_fRate*40, 0,
  50. nNameWidth, nRowCount*ui->label_bigQuesionName->height());
  51. }
  52. ui->line_question->setGeometry(g_appInfoPtr->m_fRate*40, ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + g_appInfoPtr->m_fRate*20, width() - g_appInfoPtr->m_fRate*40*2, g_appInfoPtr->m_fRate*2);
  53. // ui->list_question->setGeometry(0, ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + 40,
  54. // width() - 6, 280);
  55. ui->splitter->setGeometry(g_appInfoPtr->m_fRate*40, ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + g_appInfoPtr->m_fRate*40,
  56. width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6, nHeight - ui->label_bigQuesionName->y() - ui->label_bigQuesionName->height() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*52);
  57. // ui->splitter->setStretchFactor(0, 1);
  58. // ui->splitter->setStretchFactor(1, 2);
  59. ui->list_body->setGeometry(0, 0, ui->splitter->width(), ui->splitter->height()/3);
  60. ui->list_question->setGeometry(0, ui->splitter->height()/3, ui->splitter->width(), 2*ui->splitter->height()/3);
  61. initBody();
  62. for (int i = 0; i < m_qs.vSubQuestionStruct.size(); ++i)
  63. {
  64. if (m_qs.vSubQuestionStruct[i].nOrder == m_nOrder)
  65. {
  66. initSubQuestionItem(m_qs.vSubQuestionStruct[i]);
  67. }
  68. }
  69. if(m_pWidgetChangeQuestion == nullptr)
  70. {
  71. m_pWidgetChangeQuestion = new changeQuestion(this);
  72. m_pWidgetChangeQuestion->setUI(0, ui->splitter->y() + ui->splitter->height(), width(), g_appInfoPtr->m_fRate*52);
  73. }
  74. m_pWidgetChangeQuestion->show();
  75. connect(m_pWidgetChangeQuestion, &changeQuestion::previousQuestion, this, &questionSet::onPreviousQuestion);
  76. connect(m_pWidgetChangeQuestion, &changeQuestion::nextQuestion, this, &questionSet::onNextQuestion);
  77. m_pWidgetChangeQuestion->showBtn(3);
  78. if(m_nOrder == 1)
  79. {
  80. m_pWidgetChangeQuestion->showBtn(1);
  81. }
  82. else if(m_nOrder == m_nTotalSubQuestion)
  83. {
  84. m_pWidgetChangeQuestion->showBtn(2);
  85. }
  86. }
  87. void questionSet::questionSet::showBtn(int nType)
  88. {
  89. m_pWidgetChangeQuestion->showBtn(nType);
  90. }
  91. void questionSet::onPreviousQuestion()
  92. {
  93. emit previousQuestion(m_nOrder);
  94. }
  95. void questionSet::onNextQuestion()
  96. {
  97. emit nextQuestion(m_nOrder);
  98. }
  99. void questionSet::initBody()
  100. {
  101. Json::Reader reader;
  102. Json::Value jBody = Json::Value::null;
  103. if(!reader.parse(m_qs.sBody.toStdString(), jBody))
  104. {
  105. // ShowMsg(QString::fromLocal8Bit("解析题干出错!"), g_appInfoPtr->m_answerWidget);
  106. myDebug()<<QString::fromLocal8Bit("解析题干出错!");
  107. }
  108. int nIndex = 1;
  109. int nSectionSize = jBody["sections"].size();
  110. Json::Value jSections = Json::Value::null;
  111. for(int i = 0; i < nSectionSize; i++)
  112. {
  113. Json::Value jblocks = Json::Value::null;
  114. int nBlockSize = jBody["sections"][i]["blocks"].size();
  115. for(int j = 0; j < nBlockSize; j++)
  116. {
  117. if(jBody["sections"][i]["blocks"][j]["type"].asString() == "audio")
  118. {
  119. if(jblocks != Json::Value::null ||
  120. jSections != Json::Value::null)
  121. {
  122. if(jblocks != Json::Value::null)
  123. {
  124. Json::Value jBlockItem = Json::Value::null;
  125. jBlockItem["blocks"] = jblocks;
  126. jblocks = Json::Value::null;
  127. jSections.append(jBlockItem);
  128. }
  129. Json::Value jQuestionBody = Json::Value::null;
  130. jQuestionBody["sections"] = jSections;
  131. jSections = Json::Value::null;
  132. jblocks = Json::Value::null;
  133. questionBody *wQB = new questionBody(jQuestionBody);
  134. QListWidgetItem *listItem = new QListWidgetItem;
  135. int nQBHeight = wQB->setUI(ui->list_body->width() - 40, nIndex);
  136. listItem->setSizeHint(QSize(ui->list_body->width() - 40, nQBHeight));
  137. ui->list_body->addItem(listItem);
  138. ui->list_body->setItemWidget(listItem, wQB);
  139. }
  140. nIndex++;
  141. QString sAudioName = jBody["sections"][i]["blocks"][j]["ext2"].asString().c_str();
  142. QString sAudioUrl = jBody["sections"][i]["blocks"][j]["value"].asString().c_str();
  143. audioPlay *wAP = new audioPlay(sAudioName, sAudioUrl, m_qs.nLimitedPlayTimes);
  144. connect(wAP, &audioPlay::playedCountChange, this, [&](){
  145. for(int i = 0; i < ui->list_question->count(); i++)
  146. {
  147. CQuestionBaseWidget *item = dynamic_cast<CQuestionBaseWidget*>(ui->list_question->itemWidget(ui->list_question->item(i)));
  148. if(item && item->widgetType() == wt_question)
  149. {
  150. item->audioPlayCountChange();
  151. }
  152. }
  153. });
  154. QListWidgetItem *listItem = new QListWidgetItem;
  155. int nAPHeight = wAP->setUI(ui->list_body->width() - 40);
  156. listItem->setSizeHint(QSize(ui->list_body->width() - 40, nAPHeight));
  157. ui->list_body->addItem(listItem);
  158. ui->list_body->setItemWidget(listItem, wAP);
  159. }
  160. else
  161. {
  162. jblocks.append(jBody["sections"][i]["blocks"][j]);
  163. }
  164. }
  165. if(jblocks != Json::Value::null)
  166. {
  167. Json::Value jBlockItem = Json::Value::null;
  168. jBlockItem["blocks"] = jblocks;
  169. jblocks = Json::Value::null;
  170. jSections.append(jBlockItem);
  171. }
  172. }
  173. if(jSections != Json::Value::null)
  174. {
  175. Json::Value jQuestionBody = Json::Value::null;
  176. jQuestionBody["sections"] = jSections;
  177. jSections = Json::Value::null;
  178. questionBody *wQB = new questionBody(jQuestionBody);
  179. QListWidgetItem *listItem = new QListWidgetItem;
  180. int nQBHeight = wQB->setUI(ui->list_body->width() - 40, nIndex);
  181. listItem->setSizeHint(QSize(ui->list_body->width() - 40, nQBHeight));
  182. ui->list_body->addItem(listItem);
  183. ui->list_body->setItemWidget(listItem, wQB);
  184. }
  185. }
  186. void questionSet::initSubQuestionItem(CSubQuestionStruct &subQuestionItem)
  187. {
  188. if(subQuestionItem.sQuestionType == QUESTION_TYPE::SingleChoice ||
  189. subQuestionItem.sQuestionType == QUESTION_TYPE::MultipleChoice ||
  190. subQuestionItem.sQuestionType == QUESTION_TYPE::TrueOrFalse)
  191. {
  192. choiceQuesiton *wCQ = new choiceQuesiton(subQuestionItem);
  193. connect(wCQ, &choiceQuesiton::markedItem, this, &questionSet::onMarkedItem);
  194. connect(wCQ, &choiceQuesiton::questionAnswered, this, &questionSet::onQuestionAnswered);
  195. connect(wCQ, &choiceQuesiton::uploadAnswer, this, &questionSet::onUploadAnswer);
  196. int nHeight = wCQ->setUI(ui->list_question->width());
  197. QListWidgetItem *listItem = new QListWidgetItem;
  198. listItem->setSizeHint(QSize(ui->list_question->width(), nHeight));
  199. ui->list_question->addItem(listItem);
  200. ui->list_question->setItemWidget(listItem, wCQ);
  201. }
  202. else if(subQuestionItem.sQuestionType == QUESTION_TYPE::FillUp)
  203. {
  204. fillBlank *wFB = new fillBlank(subQuestionItem);
  205. connect(wFB, &fillBlank::markedItem, this, &questionSet::onMarkedItem);
  206. connect(wFB, &fillBlank::questionAnswered, this, &questionSet::onQuestionAnswered);
  207. connect(wFB, &fillBlank::uploadAnswer, this, &questionSet::onUploadAnswer);
  208. int nHeight = wFB->setUI(ui->list_question->width());
  209. QListWidgetItem *listItem = new QListWidgetItem;
  210. listItem->setSizeHint(QSize(ui->list_question->width(), nHeight));
  211. ui->list_question->addItem(listItem);
  212. ui->list_question->setItemWidget(listItem, wFB);
  213. }
  214. else if(subQuestionItem.sQuestionType == QUESTION_TYPE::Essay)
  215. {
  216. questionAndAnswer *wQAA = new questionAndAnswer(subQuestionItem);
  217. connect(wQAA, &questionAndAnswer::markedItem, this, &questionSet::onMarkedItem);
  218. connect(wQAA, &questionAndAnswer::questionAnswered, this, &questionSet::onQuestionAnswered);
  219. connect(wQAA, &questionAndAnswer::uploadAnswer, this, &questionSet::onUploadAnswer);
  220. int nHeight = wQAA->setUI(ui->list_question->width());
  221. QListWidgetItem *listItem = new QListWidgetItem;
  222. listItem->setSizeHint(QSize(ui->list_question->width(), nHeight));
  223. ui->list_question->addItem(listItem);
  224. ui->list_question->setItemWidget(listItem, wQAA);
  225. }
  226. if(g_appInfoPtr->m_oExamInfo.sExamType == "PRACTICE" && g_appInfoPtr->m_oExamInfo.sPracticeType == "IN_PRACTICE")
  227. {
  228. standardAnswer *wSA = new standardAnswer(subQuestionItem);
  229. connect(wSA, &standardAnswer::heightChange, this, [&](int nH){
  230. for(int i = 0; i < ui->list_question->count(); i++)
  231. {
  232. CQuestionBaseWidget *item = dynamic_cast<CQuestionBaseWidget*>(ui->list_question->itemWidget(ui->list_question->item(i)));
  233. if(item && item->widgetType() == wt_standardAnswer)
  234. {
  235. QListWidgetItem *pItem = ui->list_question->item(i);
  236. pItem->setSizeHint(QSize(ui->list_question->width() - 8, nH));
  237. }
  238. }
  239. });
  240. int nHeight = wSA->setUI(ui->list_question->width() - 8);
  241. QListWidgetItem *listItem = new QListWidgetItem;
  242. listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight));
  243. ui->list_question->addItem(listItem);
  244. ui->list_question->setItemWidget(listItem, wSA);
  245. }
  246. }
  247. void questionSet::setGroupInfo(QString sTitle, QString sProgress)
  248. {
  249. if(!sTitle.isEmpty())
  250. {
  251. ui->label_bigQuesionName->setText(sTitle);
  252. }
  253. ui->label_groupProgress->setText(sProgress);
  254. }
  255. void questionSet::onMarkedItem(bool bMarked, int nOrder)
  256. {
  257. emit markedItem(bMarked, nOrder);
  258. }
  259. void questionSet::onQuestionAnswered(bool bAnswered, int nOrder)
  260. {
  261. emit questionAnswered(bAnswered, nOrder);
  262. }
  263. void questionSet::onUploadAnswer(int nOrder, __int64 timeStamp, QString sAnswer)
  264. {
  265. emit uploadAnswer(nOrder, timeStamp, sAnswer);
  266. }
  267. void questionSet::handinPaper()
  268. {
  269. for(int i = 0; i < ui->list_question->count(); i++)
  270. {
  271. CQuestionBaseWidget *item = dynamic_cast<CQuestionBaseWidget*>(ui->list_question->itemWidget(ui->list_question->item(i)));
  272. if(item && item->widgetType() == wt_question)
  273. {
  274. item->handinPaper();
  275. }
  276. }
  277. }