qaaBlank.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #include "qaaBlank.h"
  2. #include "ui_qaaBlank.h"
  3. #include <QFile>
  4. #include <QTextBlock>
  5. //#include "MsgDlg.h"
  6. #include "CAppInfo.h"
  7. #include "CCommonTools.h"
  8. #include "logproc.h"
  9. #include <QTextDocumentFragment>
  10. qaaBlank::qaaBlank(QWidget *parent) :
  11. CBaseWidget(parent),
  12. ui(new Ui::qaaBlank)
  13. {
  14. ui->setupUi(this);
  15. setAttribute(Qt::WA_DeleteOnClose);
  16. setStyleSheet(g_appInfoPtr->m_sQssStr);
  17. }
  18. qaaBlank::~qaaBlank()
  19. {
  20. delete ui;
  21. }
  22. int qaaBlank::setUI(const int nWidth)
  23. {
  24. setGeometry(0, 0, nWidth, g_appInfoPtr->m_fRate*284);
  25. ui->btn_qaab_copy->setGeometry(0, g_appInfoPtr->m_fRate*20, g_appInfoPtr->m_fRate*40, g_appInfoPtr->m_fRate*22);
  26. ui->btn_qaab_cut->setGeometry(ui->btn_qaab_copy->x() + ui->btn_qaab_copy->width() + g_appInfoPtr->m_fRate*5,
  27. ui->btn_qaab_copy->y(), ui->btn_qaab_copy->width(), ui->btn_qaab_copy->height());
  28. ui->btn_qaab_paste->setGeometry(ui->btn_qaab_cut->x() + ui->btn_qaab_cut->width() + g_appInfoPtr->m_fRate*5,
  29. ui->btn_qaab_copy->y(), ui->btn_qaab_copy->width(), ui->btn_qaab_copy->height());
  30. ui->btn_qaab_superscript->setGeometry(ui->btn_qaab_paste->x() + ui->btn_qaab_paste->width() + g_appInfoPtr->m_fRate*5,
  31. ui->btn_qaab_copy->y(), ui->btn_qaab_copy->width(), ui->btn_qaab_copy->height());
  32. ui->btn_qaab_cancelSup->setGeometry(ui->btn_qaab_superscript->x() + ui->btn_qaab_superscript->width() + g_appInfoPtr->m_fRate*5,
  33. ui->btn_qaab_copy->y(), g_appInfoPtr->m_fRate*64, ui->btn_qaab_copy->height());
  34. ui->btn_qaab_subscript->setGeometry(ui->btn_qaab_cancelSup->x() + ui->btn_qaab_cancelSup->width() + g_appInfoPtr->m_fRate*5,
  35. ui->btn_qaab_copy->y(), ui->btn_qaab_copy->width(), ui->btn_qaab_copy->height());
  36. ui->btn_qaab_cancelSub->setGeometry(ui->btn_qaab_subscript->x() + ui->btn_qaab_subscript->width() + g_appInfoPtr->m_fRate*5,
  37. ui->btn_qaab_copy->y(), ui->btn_qaab_cancelSup->width(), ui->btn_qaab_copy->height());
  38. ui->tedt_qaa_blank->setGeometry(0, ui->btn_qaab_copy->y() + ui->btn_qaab_copy->height() + g_appInfoPtr->m_fRate*12, g_appInfoPtr->m_fRate*640, g_appInfoPtr->m_fRate*220);
  39. return g_appInfoPtr->m_fRate*284;
  40. }
  41. int qaaBlank::widgetType()
  42. {
  43. return wt_QAABlank;
  44. }
  45. void qaaBlank::on_tedt_qaa_blank_textChanged()
  46. {
  47. QString sAnswer = ui->tedt_qaa_blank->toPlainText();
  48. if(sAnswer.isEmpty())
  49. {
  50. emit answerChanged(false);
  51. }
  52. else
  53. {
  54. emit answerChanged(true);
  55. }
  56. QApplication::processEvents();
  57. }
  58. void qaaBlank::getAnswer(QString &sAnswer)
  59. {
  60. sAnswer = "";
  61. auto bodyDoc = ui->tedt_qaa_blank->document();
  62. if(!bodyDoc->isEmpty())
  63. {
  64. Json::Value sectionJson = Json::Value::null;
  65. for (QTextBlock it = bodyDoc->begin(); it != bodyDoc->end(); it = it.next())
  66. {
  67. Json::Value blocksJson = Json::Value::null;
  68. for(auto fragit = it.begin(); !fragit.atEnd(); ++fragit)
  69. {
  70. if(fragit.fragment().charFormat().isImageFormat())
  71. {//图片
  72. const std::string& txt = fragit.fragment().charFormat().toImageFormat().name().toLocal8Bit().toStdString();
  73. if(0 == txt.find_first_of("data:image/"))
  74. {
  75. }
  76. else
  77. {
  78. }
  79. }
  80. else
  81. {//文本
  82. QString sText = fragit.fragment().text();
  83. if(fragit.fragment().charFormat().verticalAlignment() == QTextCharFormat::AlignSuperScript)
  84. {
  85. sText = QString("<sup>%1</sup>").arg(sText);
  86. }
  87. else if(fragit.fragment().charFormat().verticalAlignment() == QTextCharFormat::AlignSubScript)
  88. {
  89. sText = QString("<sub>%1</sub>").arg(sText);
  90. }
  91. sAnswer += sText;
  92. }
  93. }
  94. sAnswer += "\r\n";
  95. }
  96. }
  97. }
  98. void qaaBlank::setAnswer(QString sAnswer)
  99. {
  100. if(sAnswer.isEmpty())
  101. {
  102. return;
  103. }
  104. Json::Value jAnswer = Json::Value::null;
  105. Json::Reader reader;
  106. qDebug()<<sAnswer;
  107. if(!reader.parse(sAnswer.toStdString(), jAnswer))
  108. {
  109. // ShowMsg(QString::fromLocal8Bit("解析答案出错!"), g_appInfoPtr->m_answerWidget);
  110. myDebug()<<QString::fromLocal8Bit("解析答案出错!");
  111. return;
  112. }
  113. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  114. // for(int ia = 0; ia < (int)jAnswer.size(); ia++)
  115. {
  116. int nSize = jAnswer/*[ia]*/["sections"].size();
  117. for(int i = 0; i < nSize; i ++)
  118. {
  119. Json::Value blocks = jAnswer/*[ia]*/["sections"][i];
  120. for(int j = 0; j < (int)blocks["blocks"].size(); j++)
  121. {
  122. if(blocks["blocks"][j]["type"].asString() == "text")
  123. {
  124. QTextCharFormat fmt;
  125. QFont font;
  126. font.setFamily("Microsoft YaHei");
  127. font.setPixelSize(g_appInfoPtr->m_fRate*14);
  128. font.setWeight(QFont::Medium);
  129. fmt.setFont(font);
  130. fmt.setVerticalAlignment(QTextCharFormat::AlignNormal);
  131. QString sTextStr = blocks["blocks"][j]["value"].asString().c_str();
  132. QRegExp reg("<su([b,p])(>)");
  133. if(sTextStr.indexOf(reg) >= 0)
  134. {
  135. int nFIndex = 0;
  136. int nStartIdex = 0;
  137. while((nFIndex = sTextStr.indexOf(reg, nStartIdex)) >=0)
  138. {
  139. bool bSub = sTextStr.mid(nFIndex, 5) == "<sub>" ? true : false;
  140. int nSIndex = 0;
  141. if(bSub)
  142. {
  143. nSIndex = sTextStr.indexOf("</sub>", nFIndex + 5);
  144. fmt.setVerticalAlignment(QTextCharFormat::AlignNormal);
  145. cursor.insertText(sTextStr.mid(nStartIdex, nFIndex - nStartIdex), fmt);
  146. fmt.setVerticalAlignment(QTextCharFormat::AlignSubScript);
  147. }
  148. else
  149. {
  150. nSIndex = sTextStr.indexOf("</sup>", nFIndex + 5);
  151. fmt.setVerticalAlignment(QTextCharFormat::AlignNormal);
  152. cursor.insertText(sTextStr.mid(nStartIdex, nFIndex - nStartIdex), fmt);
  153. fmt.setVerticalAlignment(QTextCharFormat::AlignSuperScript);
  154. }
  155. if(nSIndex >= 0)
  156. {
  157. cursor.insertText(sTextStr.mid(nFIndex + 5, nSIndex - nFIndex - 5), fmt);
  158. nStartIdex = nSIndex + 6;
  159. }
  160. }
  161. fmt.setVerticalAlignment(QTextCharFormat::AlignNormal);
  162. cursor.insertText(sTextStr.mid(nStartIdex, sTextStr.length()- nStartIdex), fmt);
  163. }
  164. else
  165. {
  166. if (blocks["blocks"][j].isMember("param"))
  167. {
  168. if (blocks["blocks"][j]["param"].isMember("sup"))
  169. {
  170. fmt.setVerticalAlignment(QTextCharFormat::AlignSuperScript);
  171. }
  172. else if (blocks["blocks"][j]["param"].isMember("sub"))
  173. {
  174. fmt.setVerticalAlignment(QTextCharFormat::AlignSubScript);
  175. }
  176. }
  177. cursor.insertText(blocks["blocks"][j]["value"].asString().c_str(), fmt);
  178. }
  179. }
  180. }
  181. if(i < nSize - 1)
  182. {
  183. cursor.insertText("\n");
  184. }
  185. }
  186. }
  187. ui->tedt_qaa_blank->setTextCursor(cursor);
  188. }
  189. void qaaBlank::on_btn_qaab_mark_clicked()
  190. {
  191. //标记
  192. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  193. if (!cursor.hasSelection())
  194. {
  195. return;
  196. }
  197. QTextCharFormat fmt = cursor.charFormat();
  198. QTextCharFormat oldFmt = fmt;
  199. if (fmt.background() == QColor(22, 122, 22))
  200. // {
  201. // fmt.setBackground(QColor(255, 255, 255));
  202. // }
  203. // else
  204. {
  205. fmt.setBackground(QColor(22, 122, 22));
  206. }
  207. cursor.mergeCharFormat(fmt);
  208. cursor.movePosition(QTextCursor::End);
  209. cursor.mergeCharFormat(oldFmt);
  210. ui->tedt_qaa_blank->setTextCursor(cursor);
  211. }
  212. void qaaBlank::on_btn_qaab_cut_clicked()
  213. {
  214. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  215. if (!cursor.hasSelection())
  216. {
  217. return;
  218. }
  219. ui->tedt_qaa_blank->cut();
  220. }
  221. void qaaBlank::on_btn_qaab_paste_clicked()
  222. {
  223. ui->tedt_qaa_blank->paste();
  224. }
  225. void qaaBlank::on_btn_qaab_superscript_clicked()
  226. {
  227. //上标
  228. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  229. if (!cursor.hasSelection())
  230. {
  231. return;
  232. }
  233. QTextCharFormat fmt = cursor.charFormat();
  234. QTextCharFormat oldFmt = fmt;
  235. fmt.setVerticalAlignment(QTextCharFormat::AlignSuperScript);
  236. cursor.mergeCharFormat(fmt);
  237. cursor.movePosition(QTextCursor::End);
  238. cursor.setCharFormat(oldFmt);
  239. ui->tedt_qaa_blank->setTextCursor(cursor);
  240. }
  241. void qaaBlank::on_btn_qaab_cancelSup_clicked()
  242. {
  243. //取消上标
  244. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  245. if (!cursor.hasSelection())
  246. {
  247. return;
  248. }
  249. QString tdf = cursor.selection().toHtml();
  250. int n = tdf.indexOf("vertical-align:sup");
  251. QTextCharFormat fmt = cursor.charFormat();
  252. if(tdf.indexOf("vertical-align:sup") < 0)
  253. {
  254. return;
  255. }
  256. fmt.setVerticalAlignment(QTextCharFormat::AlignNormal);
  257. cursor.mergeCharFormat(fmt);
  258. ui->tedt_qaa_blank->setTextCursor(cursor);
  259. }
  260. void qaaBlank::on_btn_qaab_subscript_clicked()
  261. {
  262. //下标
  263. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  264. if (!cursor.hasSelection())
  265. {
  266. return;
  267. }
  268. QTextCharFormat fmt = cursor.charFormat();
  269. QTextCharFormat oldFmt = fmt;
  270. fmt.setVerticalAlignment(QTextCharFormat::AlignSubScript);
  271. cursor.mergeCharFormat(fmt);
  272. cursor.movePosition(QTextCursor::End);
  273. cursor.setCharFormat(oldFmt);
  274. ui->tedt_qaa_blank->setTextCursor(cursor);
  275. }
  276. void qaaBlank::on_btn_qaab_cancelSub_clicked()
  277. {
  278. //取消下标
  279. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  280. if (!cursor.hasSelection())
  281. {
  282. return;
  283. }
  284. QString tdf = cursor.selection().toHtml();
  285. int n = tdf.indexOf("vertical-align:sub");
  286. QTextCharFormat fmt = cursor.charFormat();
  287. if(tdf.indexOf("vertical-align:sub") < 0)
  288. {
  289. return;
  290. }
  291. fmt.setVerticalAlignment(QTextCharFormat::AlignNormal);
  292. cursor.mergeCharFormat(fmt);
  293. ui->tedt_qaa_blank->setTextCursor(cursor);
  294. }
  295. void qaaBlank::on_btn_qaab_copy_clicked()
  296. {
  297. QTextCursor cursor = ui->tedt_qaa_blank->textCursor();
  298. if (!cursor.hasSelection())
  299. {
  300. return;
  301. }
  302. ui->tedt_qaa_blank->copy();
  303. }