#include "question.h" #include "ui_question.h" #include #include #include "choiceQuesiton.h" #include "fillBlank.h" #include "questionAndAnswer.h" #include "standardAnswer.h" #include "CAppInfo.h" question::question(CQuestionStruct &qs, int nOrder, int nTotalSubQuestion, QWidget *parent) : QWidget(parent), ui(new Ui::question), m_qs(qs), m_nOrder(nOrder), m_nTotalSubQuestion(nTotalSubQuestion) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose); m_pWidgetChangeQuestion = nullptr; setStyleSheet(g_appInfoPtr->m_sQssStr); ui->list_question->setVerticalScrollMode(QListWidget::ScrollPerPixel); ui->list_question->verticalScrollBar()->setSingleStep(g_appInfoPtr->m_fRate * 5); } question::~question() { if(m_pWidgetChangeQuestion != nullptr) { delete m_pWidgetChangeQuestion; m_pWidgetChangeQuestion = nullptr; } delete ui; } void question::setUI(const int nLeft, const int nTop, const int nWidth, const int nHeight) { setGeometry(nLeft, nTop, nWidth, nHeight); ui->label_bigQuesionName->adjustSize(); ui->label_bigQuesionName->setGeometry(g_appInfoPtr->m_fRate*40, 0, ui->label_bigQuesionName->width(), ui->label_bigQuesionName->height()); ui->label_groupProgress->adjustSize(); ui->label_groupProgress->setGeometry(width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6 - ui->label_groupProgress->width(), ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() - ui->label_groupProgress->height(), ui->label_groupProgress->width(), ui->label_groupProgress->height()); int nNameWidth = ui->label_groupProgress->x() - ui->label_bigQuesionName->x() - g_appInfoPtr->m_fRate*20; int nRowCount = (ui->label_bigQuesionName->width() + nNameWidth - 1)/nNameWidth; if(nRowCount > 1) { ui->label_bigQuesionName->setWordWrap(true); ui->label_bigQuesionName->setGeometry(g_appInfoPtr->m_fRate*40, 0, nNameWidth, nRowCount*ui->label_bigQuesionName->height()); } 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); int nQuestionTop = ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + g_appInfoPtr->m_fRate*40; ui->list_question->setGeometry(g_appInfoPtr->m_fRate*40, nQuestionTop, width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6, nHeight - nQuestionTop - g_appInfoPtr->m_fRate*52); m_nListHeight = 0; for (int i = 0; i < m_qs.vSubQuestionStruct.size(); ++i) { if (m_qs.vSubQuestionStruct[i].nOrder == m_nOrder) { initQuestionItem(m_qs.vSubQuestionStruct[i]); } } if(m_nListHeight + g_appInfoPtr->m_fRate*10 < ui->list_question->height()) { ui->list_question->setGeometry(g_appInfoPtr->m_fRate*40, ui->label_bigQuesionName->y() + ui->label_bigQuesionName->height() + 40, width() - g_appInfoPtr->m_fRate*40 - g_appInfoPtr->m_fRate*6, m_nListHeight + g_appInfoPtr->m_fRate*10); } if(m_pWidgetChangeQuestion == nullptr) { m_pWidgetChangeQuestion = new changeQuestion(this); m_pWidgetChangeQuestion->setUI(0, ui->list_question->y() + ui->list_question->height(), width(), g_appInfoPtr->m_fRate*52); } m_pWidgetChangeQuestion->show(); connect(m_pWidgetChangeQuestion, &changeQuestion::previousQuestion, this, &question::onPreviousQuestion); connect(m_pWidgetChangeQuestion, &changeQuestion::nextQuestion, this, &question::onNextQuestion); m_pWidgetChangeQuestion->showBtn(3); if(m_nOrder == 1) { m_pWidgetChangeQuestion->showBtn(1); } else if(m_nOrder == m_nTotalSubQuestion) { m_pWidgetChangeQuestion->showBtn(2); } } void question::showBtn(int nType) { m_pWidgetChangeQuestion->showBtn(nType); } void question::onPreviousQuestion() { emit previousQuestion(m_nOrder); } void question::onNextQuestion() { emit nextQuestion(m_nOrder); } int question::initQuestionItem(CSubQuestionStruct &subQuestionItem) { if(subQuestionItem.sQuestionType == QUESTION_TYPE::SingleChoice || subQuestionItem.sQuestionType == QUESTION_TYPE::MultipleChoice || subQuestionItem.sQuestionType == QUESTION_TYPE::TrueOrFalse) { choiceQuesiton *wCQ = new choiceQuesiton(subQuestionItem); connect(wCQ, &choiceQuesiton::markedItem, this, &question::onMarkedItem); connect(wCQ, &choiceQuesiton::questionAnswered, this, &question::onQuestionAnswered); connect(wCQ, &choiceQuesiton::uploadAnswer, this, &question::onUploadAnswer); int nHeight = wCQ->setUI(ui->list_question->width() - 8); m_nListHeight += nHeight; QListWidgetItem *listItem = new QListWidgetItem; ui->list_question->addItem(listItem); listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight)); ui->list_question->setItemWidget(listItem, wCQ); } else if(subQuestionItem.sQuestionType == QUESTION_TYPE::FillUp) { fillBlank *wFB = new fillBlank(subQuestionItem); connect(wFB, &fillBlank::markedItem, this, &question::onMarkedItem); connect(wFB, &fillBlank::questionAnswered, this, &question::onQuestionAnswered); connect(wFB, &fillBlank::uploadAnswer, this, &question::onUploadAnswer); int nHeight = wFB->setUI(ui->list_question->width() - 8); m_nListHeight += nHeight; QListWidgetItem *listItem = new QListWidgetItem; listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight)); ui->list_question->addItem(listItem); ui->list_question->setItemWidget(listItem, wFB); } else if(subQuestionItem.sQuestionType == QUESTION_TYPE::Essay) { questionAndAnswer *wQAA = new questionAndAnswer(subQuestionItem); connect(wQAA, &questionAndAnswer::markedItem, this, &question::onMarkedItem); connect(wQAA, &questionAndAnswer::questionAnswered, this, &question::onQuestionAnswered); connect(wQAA, &questionAndAnswer::uploadAnswer, this, &question::onUploadAnswer); int nHeight = wQAA->setUI(ui->list_question->width() - 8); m_nListHeight += nHeight; QListWidgetItem *listItem = new QListWidgetItem; listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight)); ui->list_question->addItem(listItem); ui->list_question->setItemWidget(listItem, wQAA); } if(g_appInfoPtr->m_oExamInfo.sExamType == "PRACTICE" && g_appInfoPtr->m_oExamInfo.sPracticeType == "IN_PRACTICE") { standardAnswer *wSA = new standardAnswer(subQuestionItem); connect(wSA, &standardAnswer::heightChange, this, [&](int nH){ for(int i = 0; i < ui->list_question->count(); i++) { CQuestionBaseWidget *item = dynamic_cast(ui->list_question->itemWidget(ui->list_question->item(i))); if(item && item->widgetType() == wt_standardAnswer) { QListWidgetItem *pItem = ui->list_question->item(i); pItem->setSizeHint(QSize(ui->list_question->width() - 8, nH)); } } }); int nHeight = wSA->setUI(ui->list_question->width() - 8); m_nListHeight += nHeight; QListWidgetItem *listItem = new QListWidgetItem; listItem->setSizeHint(QSize(ui->list_question->width() - 8, nHeight)); ui->list_question->addItem(listItem); ui->list_question->setItemWidget(listItem, wSA); } return 0; } void question::setGroupInfo(QString sTitle, QString sProgress) { if(!sTitle.isEmpty()) { ui->label_bigQuesionName->setText(sTitle); } ui->label_groupProgress->setText(sProgress); } void question::handinPaper() { for(int i = 0; i < ui->list_question->count(); i++) { CQuestionBaseWidget *item = dynamic_cast(ui->list_question->itemWidget(ui->list_question->item(i))); if(item && item->widgetType() == wt_question) { item->handinPaper(); } } } void question::onMarkedItem(bool bMarked, int nOrder) { emit markedItem(bMarked, nOrder); } void question::onQuestionAnswered(bool bAnswered, int nOrder) { emit questionAnswered(bAnswered, nOrder); } void question::onUploadAnswer(int nOrder, __int64 timeStamp, QString sAnswer) { emit uploadAnswer(nOrder, timeStamp, sAnswer); }