question.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "question.h"
  2. #include "ui_question.h"
  3. #include <QFile>
  4. #include <QScrollBar>
  5. #include "choiceQuesiton.h"
  6. #include "fillBlank.h"
  7. #include "questionAndAnswer.h"
  8. #include "standardAnswer.h"
  9. #include "CAppInfo.h"
  10. question::question(CQuestionStruct &qs, int nOrder, int nTotalSubQuestion, QWidget *parent) :
  11. QWidget(parent),
  12. ui(new Ui::question), m_qs(qs), m_nOrder(nOrder), m_nTotalSubQuestion(nTotalSubQuestion)
  13. {
  14. ui->setupUi(this);
  15. setAttribute(Qt::WA_DeleteOnClose);
  16. m_pWidgetChangeQuestion = nullptr;
  17. setStyleSheet(g_appInfoPtr->m_sQssStr);
  18. ui->list_question->setVerticalScrollMode(QListWidget::ScrollPerPixel);
  19. ui->list_question->verticalScrollBar()->setSingleStep(g_appInfoPtr->m_fRate * 5);
  20. }
  21. question::~question()
  22. {
  23. if(m_pWidgetChangeQuestion != nullptr)
  24. {
  25. delete m_pWidgetChangeQuestion;
  26. m_pWidgetChangeQuestion = nullptr;
  27. }
  28. delete ui;
  29. }
  30. void question::setUI(const int nLeft, const int nTop, const int nWidth, const int nHeight)
  31. {
  32. setGeometry(nLeft, nTop, nWidth, nHeight);
  33. ui->label_bigQuesionName->adjustSize();
  34. ui->label_bigQuesionName->setGeometry(g_appInfoPtr->m_fRate*40, 0, ui->label_bigQuesionName->width(), ui->label_bigQuesionName->height());
  35. ui->label_groupProgress->adjustSize();
  36. ui->label_groupProgress->setGeometry(width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6 - ui->label_groupProgress->width(),
  37. ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() - ui->label_groupProgress->height(),
  38. ui->label_groupProgress->width(), ui->label_groupProgress->height());
  39. int nNameWidth = ui->label_groupProgress->x() - ui->label_bigQuesionName->x() - g_appInfoPtr->m_fRate*20;
  40. int nRowCount = (ui->label_bigQuesionName->width() + nNameWidth - 1)/nNameWidth;
  41. if(nRowCount > 1)
  42. {
  43. ui->label_bigQuesionName->setWordWrap(true);
  44. ui->label_bigQuesionName->setGeometry(g_appInfoPtr->m_fRate*40, 0,
  45. nNameWidth, nRowCount*ui->label_bigQuesionName->height());
  46. }
  47. 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);
  48. int nQuestionTop = ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + g_appInfoPtr->m_fRate*40;
  49. ui->list_question->setGeometry(g_appInfoPtr->m_fRate*40, nQuestionTop,
  50. width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6, nHeight - nQuestionTop - g_appInfoPtr->m_fRate*52);
  51. m_nListHeight = 0;
  52. for (int i = 0; i < m_qs.vSubQuestionStruct.size(); ++i)
  53. {
  54. if (m_qs.vSubQuestionStruct[i].nOrder == m_nOrder)
  55. {
  56. initQuestionItem(m_qs.vSubQuestionStruct[i]);
  57. }
  58. }
  59. if(m_nListHeight + g_appInfoPtr->m_fRate*10 < ui->list_question->height())
  60. {
  61. ui->list_question->setGeometry(g_appInfoPtr->m_fRate*40, ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + 40,
  62. width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6, m_nListHeight + g_appInfoPtr->m_fRate*10);
  63. }
  64. if(m_pWidgetChangeQuestion == nullptr)
  65. {
  66. m_pWidgetChangeQuestion = new changeQuestion(this);
  67. m_pWidgetChangeQuestion->setUI(0, ui->list_question->y() + ui->list_question->height(), width(), g_appInfoPtr->m_fRate*52);
  68. }
  69. m_pWidgetChangeQuestion->show();
  70. connect(m_pWidgetChangeQuestion, &changeQuestion::previousQuestion, this, &question::onPreviousQuestion);
  71. connect(m_pWidgetChangeQuestion, &changeQuestion::nextQuestion, this, &question::onNextQuestion);
  72. m_pWidgetChangeQuestion->showBtn(3);
  73. if(m_nOrder == 1)
  74. {
  75. m_pWidgetChangeQuestion->showBtn(1);
  76. }
  77. else if(m_nOrder == m_nTotalSubQuestion)
  78. {
  79. m_pWidgetChangeQuestion->showBtn(2);
  80. }
  81. }
  82. void question::showBtn(int nType)
  83. {
  84. m_pWidgetChangeQuestion->showBtn(nType);
  85. }
  86. void question::onPreviousQuestion()
  87. {
  88. emit previousQuestion(m_nOrder);
  89. }
  90. void question::onNextQuestion()
  91. {
  92. emit nextQuestion(m_nOrder);
  93. }
  94. int question::initQuestionItem(CSubQuestionStruct &subQuestionItem)
  95. {
  96. if(subQuestionItem.sQuestionType == QUESTION_TYPE::SingleChoice ||
  97. subQuestionItem.sQuestionType == QUESTION_TYPE::MultipleChoice ||
  98. subQuestionItem.sQuestionType == QUESTION_TYPE::TrueOrFalse)
  99. {
  100. choiceQuesiton *wCQ = new choiceQuesiton(subQuestionItem);
  101. connect(wCQ, &choiceQuesiton::markedItem, this, &question::onMarkedItem);
  102. connect(wCQ, &choiceQuesiton::questionAnswered, this, &question::onQuestionAnswered);
  103. connect(wCQ, &choiceQuesiton::uploadAnswer, this, &question::onUploadAnswer);
  104. int nHeight = wCQ->setUI(ui->list_question->width() - 8);
  105. m_nListHeight += nHeight;
  106. QListWidgetItem *listItem = new QListWidgetItem;
  107. ui->list_question->addItem(listItem);
  108. listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight));
  109. ui->list_question->setItemWidget(listItem, wCQ);
  110. }
  111. else if(subQuestionItem.sQuestionType == QUESTION_TYPE::FillUp)
  112. {
  113. fillBlank *wFB = new fillBlank(subQuestionItem);
  114. connect(wFB, &fillBlank::markedItem, this, &question::onMarkedItem);
  115. connect(wFB, &fillBlank::questionAnswered, this, &question::onQuestionAnswered);
  116. connect(wFB, &fillBlank::uploadAnswer, this, &question::onUploadAnswer);
  117. int nHeight = wFB->setUI(ui->list_question->width() - 8);
  118. m_nListHeight += nHeight;
  119. QListWidgetItem *listItem = new QListWidgetItem;
  120. listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight));
  121. ui->list_question->addItem(listItem);
  122. ui->list_question->setItemWidget(listItem, wFB);
  123. }
  124. else if(subQuestionItem.sQuestionType == QUESTION_TYPE::Essay)
  125. {
  126. questionAndAnswer *wQAA = new questionAndAnswer(subQuestionItem);
  127. connect(wQAA, &questionAndAnswer::markedItem, this, &question::onMarkedItem);
  128. connect(wQAA, &questionAndAnswer::questionAnswered, this, &question::onQuestionAnswered);
  129. connect(wQAA, &questionAndAnswer::uploadAnswer, this, &question::onUploadAnswer);
  130. int nHeight = wQAA->setUI(ui->list_question->width() - 8);
  131. m_nListHeight += nHeight;
  132. QListWidgetItem *listItem = new QListWidgetItem;
  133. listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight));
  134. ui->list_question->addItem(listItem);
  135. ui->list_question->setItemWidget(listItem, wQAA);
  136. }
  137. if(g_appInfoPtr->m_oExamInfo.sExamType == "PRACTICE" && g_appInfoPtr->m_oExamInfo.sPracticeType == "IN_PRACTICE")
  138. {
  139. standardAnswer *wSA = new standardAnswer(subQuestionItem);
  140. connect(wSA, &standardAnswer::heightChange, this, [&](int nH){
  141. for(int i = 0; i < ui->list_question->count(); i++)
  142. {
  143. CQuestionBaseWidget *item = dynamic_cast<CQuestionBaseWidget*>(ui->list_question->itemWidget(ui->list_question->item(i)));
  144. if(item && item->widgetType() == wt_standardAnswer)
  145. {
  146. QListWidgetItem *pItem = ui->list_question->item(i);
  147. pItem->setSizeHint(QSize(ui->list_question->width() - 8, nH));
  148. }
  149. }
  150. });
  151. int nHeight = wSA->setUI(ui->list_question->width() - 8);
  152. m_nListHeight += nHeight;
  153. QListWidgetItem *listItem = new QListWidgetItem;
  154. listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight));
  155. ui->list_question->addItem(listItem);
  156. ui->list_question->setItemWidget(listItem, wSA);
  157. }
  158. return 0;
  159. }
  160. void question::setGroupInfo(QString sTitle, QString sProgress)
  161. {
  162. if(!sTitle.isEmpty())
  163. {
  164. ui->label_bigQuesionName->setText(sTitle);
  165. }
  166. ui->label_groupProgress->setText(sProgress);
  167. }
  168. void question::handinPaper()
  169. {
  170. for(int i = 0; i < ui->list_question->count(); i++)
  171. {
  172. CQuestionBaseWidget *item = dynamic_cast<CQuestionBaseWidget*>(ui->list_question->itemWidget(ui->list_question->item(i)));
  173. if(item && item->widgetType() == wt_question)
  174. {
  175. item->handinPaper();
  176. }
  177. }
  178. }
  179. void question::onMarkedItem(bool bMarked, int nOrder)
  180. {
  181. emit markedItem(bMarked, nOrder);
  182. }
  183. void question::onQuestionAnswered(bool bAnswered, int nOrder)
  184. {
  185. emit questionAnswered(bAnswered, nOrder);
  186. }
  187. void question::onUploadAnswer(int nOrder, __int64 timeStamp, QString sAnswer)
  188. {
  189. emit uploadAnswer(nOrder, timeStamp, sAnswer);
  190. }