choiceQuesiton.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. #include "choiceQuesiton.h"
  2. #include "ui_choiceQuesiton.h"
  3. #include <QFile>
  4. #include "questionBody.h"
  5. #include "questionOption.h"
  6. #include "audioPlay.h"
  7. #include "CCommonTools.h"
  8. #include "CSqlite3DBProc.h"
  9. //#include "MsgDlg.h"
  10. #include "CAppInfo.h"
  11. #include "logproc.h"
  12. choiceQuesiton::choiceQuesiton(CSubQuestionStruct &sqs, QWidget *parent) :
  13. CQuestionBaseWidget(parent),
  14. ui(new Ui::choiceQuesiton), m_sqs(sqs)
  15. {
  16. ui->setupUi(this);
  17. setAttribute(Qt::WA_DeleteOnClose);
  18. b_isPressed = false;
  19. setStyleSheet(g_appInfoPtr->m_sQssStr);
  20. }
  21. choiceQuesiton::~choiceQuesiton()
  22. {
  23. delete ui;
  24. }
  25. int choiceQuesiton::setUI(const int nWidth)
  26. {
  27. setGeometry(0, 0, nWidth, g_appInfoPtr->m_fRate*300);
  28. ui->btn_mark->setGeometry(0, g_appInfoPtr->m_fRate*24, g_appInfoPtr->m_fRate*20, g_appInfoPtr->m_fRate*20);
  29. ui->list_choiceQuestion->setGeometry(ui->btn_mark->x() + ui->btn_mark->width() + g_appInfoPtr->m_fRate*20,
  30. g_appInfoPtr->m_fRate*20, width() -g_appInfoPtr->m_fRate* 80, g_appInfoPtr->m_fRate*280);
  31. m_nListHeight = 0;
  32. Json::Reader reader;
  33. Json::Value jBody = Json::Value::null;
  34. if(!reader.parse(m_sqs.sBody.toStdString(), jBody))
  35. {
  36. // ShowMsg(QString::fromLocal8Bit("解析题干出错!"), g_appInfoPtr->m_answerWidget);
  37. myDebug()<<QString::fromLocal8Bit("解析题干出错!");
  38. }
  39. initBody(jBody, m_sqs.nShowNumber);
  40. if(m_sqs.vOptions.size() <= 0 )
  41. {
  42. if(m_sqs.sQuestionType == QUESTION_TYPE::TrueOrFalse)
  43. {
  44. initJudgeOptions();
  45. }
  46. }
  47. else
  48. {
  49. initOptions(m_sqs.voptionPermutation, m_sqs.vOptions, m_sqs.sQuestionType);
  50. }
  51. setAnswer(m_sqs.sStudentAnswer);
  52. ui->list_choiceQuestion->setGeometry(ui->btn_mark->x() + ui->btn_mark->width() + g_appInfoPtr->m_fRate*20,
  53. g_appInfoPtr->m_fRate*20, width() - g_appInfoPtr->m_fRate*80, m_nListHeight+ g_appInfoPtr->m_fRate*10);
  54. setGeometry(0, 0, nWidth, ui->list_choiceQuestion->y() + m_nListHeight + g_appInfoPtr->m_fRate*10);
  55. setMarkStyle();
  56. return height();
  57. }
  58. void choiceQuesiton::setMarkStyle()
  59. {
  60. QString sMaredStyle = QString(R"(QPushButton#btn_mark
  61. {
  62. outline:none;
  63. border-image:url(:/images/btn-mark-hover.png);
  64. })");
  65. QString sUnmaredStyle = QString(R"(QPushButton#btn_mark
  66. {
  67. outline:none;
  68. border-image:url(:/images/btn-mark.png);
  69. })");
  70. if(m_sqs.bMarked)
  71. {
  72. ui->btn_mark->setStyleSheet(sMaredStyle);
  73. }
  74. else
  75. {
  76. ui->btn_mark->setStyleSheet(sUnmaredStyle);
  77. }
  78. }
  79. void choiceQuesiton::initJudgeOptions()
  80. {
  81. Json::Value jOption = Json::Value::null;
  82. jOption["number"] = 0;
  83. Json::Value jBlosk = Json::Value::null;
  84. jBlosk["type"] = "text";
  85. jBlosk["value"] = QString::fromLocal8Bit("正确").toStdString();
  86. Json::Value jBloskItem = Json::Value::null;
  87. jBloskItem.append(jBlosk);
  88. Json::Value jSection = Json::Value::null;
  89. jSection["blocks"] = jBloskItem;
  90. Json::Value jSectionItem = Json::Value::null;
  91. jSectionItem.append(jSection);
  92. jOption["sections"] = jSectionItem;
  93. questionOption *wQO = new questionOption(1, jOption, m_sqs.nLimitedPlayTimes);
  94. connect(wQO, &questionOption::answered, this, &choiceQuesiton::onAnswered);
  95. connect(wQO, &questionOption::cancelAnswered, this, &choiceQuesiton::onCancelAnswered);
  96. connect(wQO, &questionOption::answerChanged, this, &choiceQuesiton::onAnswerChanged);
  97. QListWidgetItem *listItem = new QListWidgetItem;
  98. int nQBHeight = wQO->setUI(ui->list_choiceQuestion->width());
  99. m_nListHeight += nQBHeight;
  100. listItem->setSizeHint(QSize(ui->list_choiceQuestion->width(), nQBHeight));
  101. ui->list_choiceQuestion->addItem(listItem);
  102. ui->list_choiceQuestion->setItemWidget(listItem, wQO);
  103. Json::Value jOption1 = Json::Value::null;
  104. jOption1["number"] = 1;
  105. Json::Value jBlosk1 = Json::Value::null;
  106. jBlosk1["type"] = "text";
  107. jBlosk1["value"] = QString::fromLocal8Bit("错误").toStdString();
  108. Json::Value jBloskItem1 = Json::Value::null;
  109. jBloskItem1.append(jBlosk1);
  110. Json::Value jSection1 = Json::Value::null;
  111. jSection1["blocks"] = jBloskItem1;
  112. Json::Value jSectionItem1 = Json::Value::null;
  113. jSectionItem1.append(jSection1);
  114. jOption1["sections"] = jSectionItem1;
  115. questionOption *wQO1 = new questionOption(2, jOption1, m_sqs.nLimitedPlayTimes);
  116. connect(wQO1, &questionOption::answered, this, &choiceQuesiton::onAnswered);
  117. connect(wQO1, &questionOption::cancelAnswered, this, &choiceQuesiton::onCancelAnswered);
  118. connect(wQO1, &questionOption::answerChanged, this, &choiceQuesiton::onAnswerChanged);
  119. QListWidgetItem *listItem1 = new QListWidgetItem;
  120. int nQBHeight1 = wQO1->setUI(ui->list_choiceQuestion->width());
  121. m_nListHeight += nQBHeight1;
  122. listItem1->setSizeHint(QSize(ui->list_choiceQuestion->width(), nQBHeight1));
  123. ui->list_choiceQuestion->addItem(listItem1);
  124. ui->list_choiceQuestion->setItemWidget(listItem1, wQO1);
  125. }
  126. void choiceQuesiton::initOptions(std::vector<int> voptionPermutation, std::vector<COption> vOptions, QString sQuestionType)
  127. {
  128. if(voptionPermutation.size() <= 0)
  129. {
  130. int nOptionSize = vOptions.size();
  131. for(int i = 0; i < nOptionSize; i++)
  132. {
  133. COption Option = vOptions[i];
  134. Json::Reader reader;
  135. Json::Value jBody = Json::Value::null;
  136. if (!reader.parse(Option.sBody.toStdString(), jBody))
  137. {
  138. // ShowMsg(QString::fromLocal8Bit("解析题干出错!"), g_appInfoPtr->m_answerWidget);
  139. myDebug() << QString::fromLocal8Bit("解析题干出错!");
  140. }
  141. jBody["number"] = i;
  142. questionOption *wQO = new questionOption(i+1, jBody, m_sqs.nLimitedPlayTimes);
  143. connect(wQO, &questionOption::answered, this, &choiceQuesiton::onAnswered);
  144. connect(wQO, &questionOption::cancelAnswered, this, &choiceQuesiton::onCancelAnswered);
  145. connect(wQO, &questionOption::answerChanged, this, &choiceQuesiton::onAnswerChanged);
  146. connect(wQO, &questionOption::mutiAnswerChanged, this, &choiceQuesiton::onMutiAnswerChanged);
  147. connect(wQO, &questionOption::audioPlayCountChange, this, [&](){audioPlayCountChange();});
  148. if(sQuestionType == QUESTION_TYPE::MultipleChoice)
  149. {
  150. wQO->setMultiChoice(true);
  151. }
  152. QListWidgetItem *listItem = new QListWidgetItem;
  153. int nQBHeight = wQO->setUI(ui->list_choiceQuestion->width());
  154. m_nListHeight += nQBHeight;
  155. listItem->setSizeHint(QSize(ui->list_choiceQuestion->width(), nQBHeight));
  156. ui->list_choiceQuestion->addItem(listItem);
  157. ui->list_choiceQuestion->setItemWidget(listItem, wQO);
  158. }
  159. }
  160. else
  161. {
  162. // QStringList strList = QString(sOrderStr.c_str()).split(",");
  163. for(int i = 0; i < voptionPermutation.size(); i++)
  164. {
  165. COption Option = vOptions[voptionPermutation[i]];
  166. Json::Reader reader;
  167. Json::Value jBody = Json::Value::null;
  168. if (!reader.parse(Option.sBody.toStdString(), jBody))
  169. {
  170. // ShowMsg(QString::fromLocal8Bit("解析题干出错!"), g_appInfoPtr->m_answerWidget);
  171. myDebug() << QString::fromLocal8Bit("解析题干出错!");
  172. }
  173. jBody["number"] = voptionPermutation[i];
  174. questionOption *wQO = new questionOption(i+1, jBody, m_sqs.nLimitedPlayTimes);
  175. connect(wQO, &questionOption::answered, this, &choiceQuesiton::onAnswered);
  176. connect(wQO, &questionOption::cancelAnswered, this, &choiceQuesiton::onCancelAnswered);
  177. connect(wQO, &questionOption::answerChanged, this, &choiceQuesiton::onAnswerChanged);
  178. connect(wQO, &questionOption::mutiAnswerChanged, this, &choiceQuesiton::onMutiAnswerChanged);
  179. connect(wQO, &questionOption::audioPlayCountChange, this, [&](){audioPlayCountChange();});
  180. if(sQuestionType == QUESTION_TYPE::MultipleChoice)
  181. {
  182. wQO->setMultiChoice(true);
  183. }
  184. QListWidgetItem *listItem = new QListWidgetItem;
  185. int nQBHeight = wQO->setUI(ui->list_choiceQuestion->width());
  186. m_nListHeight += nQBHeight;
  187. listItem->setSizeHint(QSize(ui->list_choiceQuestion->width(), nQBHeight));
  188. ui->list_choiceQuestion->addItem(listItem);
  189. ui->list_choiceQuestion->setItemWidget(listItem, wQO);
  190. }
  191. }
  192. }
  193. void choiceQuesiton::setAnswer(QString sAnswer)
  194. {
  195. if(sAnswer.isEmpty())
  196. {
  197. return;
  198. }
  199. if(m_sqs.sQuestionType == QUESTION_TYPE::TrueOrFalse)
  200. {
  201. sAnswer = sAnswer == "true" ? "0" : "1";
  202. }
  203. bool bAnswered = false;
  204. // QStringList list = sAnswer.split(",");
  205. for(int i = 0; i < ui->list_choiceQuestion->count(); i++)
  206. {
  207. CBaseWidget *baseWidget = dynamic_cast<CBaseWidget*>(ui->list_choiceQuestion->itemWidget(ui->list_choiceQuestion->item(i)));
  208. if(baseWidget->widgetType() == wt_optionItem)//选项
  209. {
  210. questionOption *wQO = dynamic_cast<questionOption*>(baseWidget);
  211. if(sAnswer.indexOf(QString::number(wQO->optionMumber())) >= 0)
  212. {
  213. wQO->setChecked(true);
  214. wQO->setAnswered(true);
  215. bAnswered = true;
  216. }
  217. }
  218. }
  219. for(int i = 0; i < ui->list_choiceQuestion->count(); i++)
  220. {
  221. CBaseWidget *baseWidget = dynamic_cast<CBaseWidget*>(ui->list_choiceQuestion->itemWidget(ui->list_choiceQuestion->item(i)));
  222. if(baseWidget->widgetType() == wt_optionItem)//选项
  223. {
  224. questionOption *wQO = dynamic_cast<questionOption*>(baseWidget);
  225. wQO->setAnswered(true);
  226. }
  227. }
  228. }
  229. void choiceQuesiton::onAnswerChanged(int nOrderIndex)
  230. {
  231. int nIdex = 1;
  232. for(int i = 0; i < ui->list_choiceQuestion->count(); i++)
  233. {
  234. CBaseWidget *baseWidget = dynamic_cast<CBaseWidget*>(ui->list_choiceQuestion->itemWidget(ui->list_choiceQuestion->item(i)));
  235. if(baseWidget->widgetType() == wt_optionItem)//选项
  236. {
  237. questionOption *wQO = dynamic_cast<questionOption*>(baseWidget);
  238. if(nIdex == nOrderIndex)
  239. {
  240. wQO->setChecked(true);
  241. }
  242. else
  243. {
  244. wQO->setChecked(false);
  245. }
  246. wQO->setAnswered(true);
  247. nIdex++;
  248. }
  249. }
  250. answerChange();
  251. }
  252. void choiceQuesiton::onAnswered()
  253. {
  254. for(int i = 0; i < ui->list_choiceQuestion->count(); i++)
  255. {
  256. CBaseWidget *baseWidget = dynamic_cast<CBaseWidget*>(ui->list_choiceQuestion->itemWidget(ui->list_choiceQuestion->item(i)));
  257. if(baseWidget->widgetType() == wt_optionItem)//选项
  258. {
  259. questionOption *wQO = dynamic_cast<questionOption*>(baseWidget);
  260. wQO->setAnswered(true);
  261. }
  262. }
  263. answerChange();
  264. }
  265. void choiceQuesiton::onCancelAnswered()
  266. {
  267. for(int i = 0; i < ui->list_choiceQuestion->count(); i++)
  268. {
  269. CBaseWidget *baseWidget = dynamic_cast<CBaseWidget*>(ui->list_choiceQuestion->itemWidget(ui->list_choiceQuestion->item(i)));
  270. if(baseWidget->widgetType() == wt_optionItem)//选项
  271. {
  272. questionOption *wQO = dynamic_cast<questionOption*>(baseWidget);
  273. wQO->setAnswered(false);
  274. }
  275. }
  276. answerChange();
  277. }
  278. void choiceQuesiton::onMutiAnswerChanged()
  279. {
  280. answerChange();
  281. }
  282. void choiceQuesiton::answerChange()
  283. {
  284. Json::Value jAudioPlayedInfo = Json::Value::null;
  285. QString sAnsStr = "";
  286. for(int i = 0; i < ui->list_choiceQuestion->count(); i++)
  287. {
  288. CBaseWidget *baseWidget = dynamic_cast<CBaseWidget*>(ui->list_choiceQuestion->itemWidget(ui->list_choiceQuestion->item(i)));
  289. if(baseWidget->widgetType() == wt_optionItem)//选项
  290. {
  291. questionOption *wQO = dynamic_cast<questionOption*>(baseWidget);
  292. if(wQO->checked())
  293. {
  294. int nNumber = wQO->optionMumber();
  295. if(m_sqs.sQuestionType == QUESTION_TYPE::TrueOrFalse)
  296. {
  297. sAnsStr += nNumber == 0 ? "true" : "false";
  298. }
  299. else
  300. {
  301. sAnsStr += QString::number(nNumber);
  302. }
  303. }
  304. }
  305. else if(baseWidget->widgetType() == wt_aduioPlay)
  306. {
  307. audioPlay *wAp = dynamic_cast<audioPlay*>(baseWidget);
  308. QString sAudioName = "";
  309. int nCount = 0;
  310. wAp->getPalyedCount(sAudioName, nCount);
  311. Json::Value jPlayedInfo = Json::Value::null;
  312. jPlayedInfo["name"] = sAudioName.toStdString();
  313. jPlayedInfo["times"] = nCount;
  314. jAudioPlayedInfo.append(jPlayedInfo);
  315. }
  316. }
  317. QString sAudioPalyedInfo = "";
  318. if(jAudioPlayedInfo != Json::Value::null)
  319. {
  320. sAudioPalyedInfo = jAudioPlayedInfo.toStyledString().c_str();
  321. }
  322. updateAnswer(sAnsStr, sAudioPalyedInfo);
  323. if(!sAnsStr.isEmpty())
  324. {
  325. m_sqs.bAnswered = true;
  326. emit questionAnswered(true, m_sqs.nOrder);
  327. }
  328. else
  329. {
  330. m_sqs.bAnswered = false;
  331. emit questionAnswered(false, m_sqs.nOrder);
  332. }
  333. }
  334. void choiceQuesiton::initBody(Json::Value jBody, int nOrderIndex)
  335. {
  336. int nIndex = 1;
  337. bool isSetItemNo = false;
  338. int nSectionSize = jBody["sections"].size();
  339. Json::Value jSections = Json::Value::null;
  340. for(int i = 0; i < nSectionSize; i++)
  341. {
  342. Json::Value jblocks = Json::Value::null;
  343. int nBlockSize = jBody["sections"][i]["blocks"].size();
  344. for(int j = 0; j < nBlockSize; j++)
  345. {
  346. if(jBody["sections"][i]["blocks"][j]["type"].asString() == "audio")
  347. {
  348. if(jblocks != Json::Value::null ||
  349. jSections != Json::Value::null)
  350. {
  351. if(jblocks != Json::Value::null)
  352. {
  353. Json::Value jBlockItem = Json::Value::null;
  354. jBlockItem["blocks"] = jblocks;
  355. jblocks = Json::Value::null;
  356. jSections.append(jBlockItem);
  357. }
  358. Json::Value jQuestionBody = Json::Value::null;
  359. jQuestionBody["sections"] = jSections;
  360. jSections = Json::Value::null;
  361. jblocks = Json::Value::null;
  362. questionBody *wQB = new questionBody(jQuestionBody);
  363. if(!isSetItemNo)
  364. {
  365. wQB->setQuesionNo(QString::fromLocal8Bit("%1.").arg(QString::number(nOrderIndex)));
  366. isSetItemNo = true;
  367. }
  368. QListWidgetItem *listItem = new QListWidgetItem;
  369. int nQBHeight = wQB->setUI(ui->list_choiceQuestion->width(), nIndex);
  370. m_nListHeight += nQBHeight;
  371. listItem->setSizeHint(QSize(ui->list_choiceQuestion->width(), nQBHeight));
  372. ui->list_choiceQuestion->addItem(listItem);
  373. ui->list_choiceQuestion->setItemWidget(listItem, wQB);
  374. }
  375. nIndex++;
  376. QString sAudioName = jBody["sections"][i]["blocks"][j]["ext2"].asString().c_str();
  377. QString sAudioUrl = jBody["sections"][i]["blocks"][j]["value"].asString().c_str();
  378. audioPlay *wAP = new audioPlay(sAudioName, sAudioUrl, m_sqs.nLimitedPlayTimes);
  379. connect(wAP, &audioPlay::playedCountChange, this, [&](){audioPlayCountChange();});
  380. QListWidgetItem *listItem = new QListWidgetItem;
  381. int nAPHeight = wAP->setUI(ui->list_choiceQuestion->width());
  382. m_nListHeight += nAPHeight;
  383. listItem->setSizeHint(QSize(ui->list_choiceQuestion->width(), nAPHeight));
  384. ui->list_choiceQuestion->addItem(listItem);
  385. ui->list_choiceQuestion->setItemWidget(listItem, wAP);
  386. }
  387. else
  388. {
  389. jblocks.append(jBody["sections"][i]["blocks"][j]);
  390. }
  391. }
  392. if(jblocks != Json::Value::null)
  393. {
  394. Json::Value jBlockItem = Json::Value::null;
  395. jBlockItem["blocks"] = jblocks;
  396. jblocks = Json::Value::null;
  397. jSections.append(jBlockItem);
  398. }
  399. }
  400. if(jSections != Json::Value::null)
  401. {
  402. Json::Value jQuestionBody = Json::Value::null;
  403. jQuestionBody["sections"] = jSections;
  404. jSections = Json::Value::null;
  405. questionBody *wQB = new questionBody(jQuestionBody);
  406. if(!isSetItemNo)
  407. {
  408. wQB->setQuesionNo(QString::fromLocal8Bit("%1.").arg(QString::number(nOrderIndex)));
  409. isSetItemNo = true;
  410. }
  411. QListWidgetItem *listItem = new QListWidgetItem;
  412. int nQBHeight = wQB->setUI(ui->list_choiceQuestion->width(), nIndex);
  413. m_nListHeight += nQBHeight;
  414. listItem->setSizeHint(QSize(ui->list_choiceQuestion->width(), nQBHeight));
  415. ui->list_choiceQuestion->addItem(listItem);
  416. ui->list_choiceQuestion->setItemWidget(listItem, wQB);
  417. }
  418. }
  419. void choiceQuesiton::on_btn_mark_clicked()
  420. {
  421. if(!b_isPressed)
  422. {
  423. b_isPressed = true;
  424. ui->btn_mark->setStyleSheet("QPushButton{border-image:url(:/images/icon-marked.png);}");
  425. }
  426. else
  427. {
  428. b_isPressed = false;
  429. ui->btn_mark->setStyleSheet("QPushButton{border-image:url(:/images/icon-unmark.png);}");
  430. }
  431. m_sqs.bMarked = b_isPressed;
  432. setMarkStyle();
  433. emit markedItem(b_isPressed, m_sqs.nOrder);
  434. }
  435. void choiceQuesiton::updateAnswer(QString sAnsStr, QString sAudioPalyedInfo)
  436. {
  437. QString sUploadAnswer = "";
  438. Json::Value jAnswerJson = Json::Value::null;
  439. __int64 timeStamp = g_appInfoPtr->serverMTime();
  440. Json::Value jAnswer = Json::Value::null;
  441. Json::Value jAnswerItem = Json::Value::null;
  442. if (!m_sqs.sAnswerType.isEmpty())
  443. {
  444. jAnswerItem["answerType"] = m_sqs.sAnswerType.toStdString();
  445. }
  446. jAnswerItem["audioPlayTimes"] = sAudioPalyedInfo.toStdString();
  447. jAnswerItem["isSign"] = m_sqs.bMarked;
  448. jAnswerItem["order"] = m_sqs.nOrder;
  449. jAnswerItem["studentAnswer"] = sAnsStr.toStdString();
  450. jAnswer.append(jAnswerItem);
  451. sUploadAnswer = jAnswer.toStyledString().c_str();
  452. qDebug()<<sUploadAnswer;
  453. m_sqs.nVersion++;
  454. m_sqs.bUpload = false;
  455. m_sqs.sStudentAnswer = sAnsStr;
  456. m_sqs.sUploadAnswer = sUploadAnswer;
  457. emit uploadAnswer(m_sqs.nOrder, timeStamp, sUploadAnswer);
  458. }
  459. void choiceQuesiton::audioPlayCountChange()
  460. {
  461. answerChange();
  462. }
  463. void choiceQuesiton::handinPaper()
  464. {
  465. }
  466. int choiceQuesiton::widgetType()
  467. {
  468. return wt_question;
  469. }