ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvUIManager.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 // LOCAL
9 #include "ecvUIManager.h"
10 
11 #include "CommonSettings.h"
12 #include "MainWindow.h"
13 #include "db_tree/ecvDBRoot.h"
14 #include "ecvPersistentSettings.h"
15 #include "ecvSettingManager.h"
16 
17 // Qt5/Qt6 Compatibility
18 #include <QtCompat.h>
19 
21  // return qApp->desktop()->availableGeometry().width();
22  return qApp->primaryScreen()->geometry().width();
23 }
24 
26  // return qApp->desktop()->availableGeometry().height();
27  return qApp->primaryScreen()->geometry().height();
28 }
29 
30 QString QUIWidget::appName() {
31  QString name = qApp->applicationFilePath();
32  QStringList list = name.split("/");
33  name = list.at(list.count() - 1).split(".").at(0);
34  return name;
35 }
36 
37 QString QUIWidget::appPath() {
38 #ifdef __arm__
39  return "/sdcard/Android/lys";
40  // return QStandardPaths::writableLocation(QStandardPaths::DataLocation);
41 #else
42  return qApp->applicationDirPath();
43 #endif
44 }
45 
46 void QUIWidget::newDir(const QString &dirName) {
47  QString strDir = dirName;
48 
49  if (!strDir.startsWith("/") && !strDir.contains(":/")) {
50  strDir = QString("%1/%2").arg(QUIWidget::appPath()).arg(strDir);
51  }
52 
53  QDir dir(strDir);
54 
55  if (!dir.exists()) {
56  dir.mkpath(strDir);
57  }
58 }
59 
60 void QUIWidget::writeInfo(const QString &info, const QString &filePath) {
61  QString fileName = QString("%1/%2/%3_runinfo_%4.txt")
62  .arg(QUIWidget::appPath())
63  .arg(filePath)
64  .arg(QUIWidget::appName())
65  .arg(QDate::currentDate().year());
66 
67  QFile file(fileName);
68  file.open(QIODevice::WriteOnly | QIODevice::Append | QFile::Text);
69  QTextStream stream(&file);
70  stream << DATETIME << info << NEWLINE;
71  file.close();
72 }
73 
74 void QUIWidget::toggleFullScreen(bool state) {
75  if (state) {
76  showFullScreen();
77  } else {
78  showNormal();
79  }
80 }
81 
83  QString qssFile = ":/qss/blue.css";
84 
85  if (style == QUIWidget::Style_Silvery) {
86  qssFile = ":/qss/silvery.css";
87  } else if (style == QUIWidget::Style_Blue) {
88  qssFile = ":/qss/blue.css";
89  } else if (style == QUIWidget::Style_LightBlue) {
90  qssFile = ":/qss/lightblue.css";
91  } else if (style == QUIWidget::Style_DarkBlue) {
92  qssFile = ":/qss/darkblue.css";
93  } else if (style == QUIWidget::Style_Gray) {
94  qssFile = ":/qss/gray.css";
95  } else if (style == QUIWidget::Style_LightGray) {
96  qssFile = ":/qss/lightgray.css";
97  } else if (style == QUIWidget::Style_DarkGray) {
98  qssFile = ":/qss/darkgray.css";
99  } else if (style == QUIWidget::Style_Black) {
100  qssFile = ":/qss/black.css";
101  } else if (style == QUIWidget::Style_LightBlack) {
102  qssFile = ":/qss/lightblack.css";
103  } else if (style == QUIWidget::Style_DarkBlack) {
104  qssFile = ":/qss/darkblack.css";
105  } else if (style == QUIWidget::Style_PSBlack) {
106  qssFile = ":/qss/psblack.css";
107  } else if (style == QUIWidget::Style_FlatBlack) {
108  qssFile = ":/qss/flatblack.css";
109  } else if (style == QUIWidget::Style_FlatWhite) {
110  qssFile = ":/qss/flatwhite.css";
111  }
112 
113  setStyle(qssFile);
114 }
115 
116 void QUIWidget::setStyle(QString &qssFile) {
117  QFile file(qssFile);
118 
119  if (file.open(QFile::ReadOnly)) {
120  QString qss = QLatin1String(file.readAll());
121  QString paletteColor = qss.mid(20, 7);
122  qApp->setPalette(QPalette(QColor(paletteColor)));
123  qApp->setStyleSheet(qss);
124  file.close();
125  }
126 }
127 
128 void QUIWidget::setStyle(const QString &qssFile,
129  QString &paletteColor,
130  QString &textColor) {
131  QFile file(qssFile);
132 
133  if (file.open(QFile::ReadOnly)) {
134  QString qss = QLatin1String(file.readAll());
135  paletteColor = qss.mid(20, 7);
136  textColor = qss.mid(49, 7);
137  qApp->setPalette(QPalette(QColor(paletteColor)));
138  qApp->setStyleSheet(qss);
139  file.close();
140  }
141 }
142 
143 void QUIWidget::setStyle(const QString &qssFile,
144  QString &textColor,
145  QString &panelColor,
146  QString &borderColor,
147  QString &normalColorStart,
148  QString &normalColorEnd,
149  QString &darkColorStart,
150  QString &darkColorEnd,
151  QString &highColor) {
152  QFile file(qssFile);
153 
154  if (file.open(QFile::ReadOnly)) {
155  QString qss = QLatin1String(file.readAll());
156  getQssColor(qss, textColor, panelColor, borderColor, normalColorStart,
157  normalColorEnd, darkColorStart, darkColorEnd, highColor);
158  qApp->setPalette(QPalette(QColor(panelColor)));
159  qApp->setStyleSheet(qss);
160  file.close();
161  }
162 }
163 
164 void QUIWidget::getQssColor(const QString &qss,
165  QString &textColor,
166  QString &panelColor,
167  QString &borderColor,
168  QString &normalColorStart,
169  QString &normalColorEnd,
170  QString &darkColorStart,
171  QString &darkColorEnd,
172  QString &highColor) {
173  QString str = qss;
174 
175  QString flagTextColor = "TextColor:";
176  int indexTextColor = str.indexOf(flagTextColor);
177 
178  if (indexTextColor >= 0) {
179  textColor = str.mid(indexTextColor + flagTextColor.length(), 7);
180  }
181 
182  QString flagPanelColor = "PanelColor:";
183  int indexPanelColor = str.indexOf(flagPanelColor);
184 
185  if (indexPanelColor >= 0) {
186  panelColor = str.mid(indexPanelColor + flagPanelColor.length(), 7);
187  }
188 
189  QString flagBorderColor = "BorderColor:";
190  int indexBorderColor = str.indexOf(flagBorderColor);
191 
192  if (indexBorderColor >= 0) {
193  borderColor = str.mid(indexBorderColor + flagBorderColor.length(), 7);
194  }
195 
196  QString flagNormalColorStart = "NormalColorStart:";
197  int indexNormalColorStart = str.indexOf(flagNormalColorStart);
198 
199  if (indexNormalColorStart >= 0) {
200  normalColorStart = str.mid(
201  indexNormalColorStart + flagNormalColorStart.length(), 7);
202  }
203 
204  QString flagNormalColorEnd = "NormalColorEnd:";
205  int indexNormalColorEnd = str.indexOf(flagNormalColorEnd);
206 
207  if (indexNormalColorEnd >= 0) {
208  normalColorEnd =
209  str.mid(indexNormalColorEnd + flagNormalColorEnd.length(), 7);
210  }
211 
212  QString flagDarkColorStart = "DarkColorStart:";
213  int indexDarkColorStart = str.indexOf(flagDarkColorStart);
214 
215  if (indexDarkColorStart >= 0) {
216  darkColorStart =
217  str.mid(indexDarkColorStart + flagDarkColorStart.length(), 7);
218  }
219 
220  QString flagDarkColorEnd = "DarkColorEnd:";
221  int indexDarkColorEnd = str.indexOf(flagDarkColorEnd);
222 
223  if (indexDarkColorEnd >= 0) {
224  darkColorEnd =
225  str.mid(indexDarkColorEnd + flagDarkColorEnd.length(), 7);
226  }
227 
228  QString flagHighColor = "HighColor:";
229  int indexHighColor = str.indexOf(flagHighColor);
230 
231  if (indexHighColor >= 0) {
232  highColor = str.mid(indexHighColor + flagHighColor.length(), 7);
233  }
234 }
235 
236 void QUIWidget::setFormInCenter(QWidget *frm) {
237  int frmX = frm->width();
238  int frmY = frm->height();
239  // Qt5/Qt6 Compatibility: QDesktopWidget removed in Qt6
240 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
241  QDesktopWidget w;
242 #endif
243  // int deskWidth = w.availableGeometry().width();
244  int deskWidth = qApp->primaryScreen()->geometry().width();
245  // int deskHeight = w.availableGeometry().height();
246  int deskHeight = qApp->primaryScreen()->geometry().height();
247  QPoint movePoint(deskWidth / 2 - frmX / 2, deskHeight / 2 - frmY / 2);
248  frm->move(movePoint);
249 }
250 
251 void QUIWidget::setTranslator(const QString &qmFile) {
252  QTranslator *translator = new QTranslator(qApp);
253  translator->load(qmFile);
254  qApp->installTranslator(translator);
255 }
256 
258 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
259  // Qt6: QTextCodec is removed, UTF-8 is used by default
260  // No need to set codec in Qt6
261  Q_UNUSED(0); // Suppress unused variable warning
262 #elif (QT_VERSION <= QT_VERSION_CHECK(5, 0, 0))
263 #if _MSC_VER
264  QTextCodec *codec = QTextCodec::codecForName("gbk");
265 #else
266  QTextCodec *codec = QTextCodec::codecForName("utf-8");
267 #endif
268  QTextCodec::setCodecForLocale(codec);
269  QTextCodec::setCodecForCStrings(codec);
270  QTextCodec::setCodecForTr(codec);
271 #else
272  QTextCodec *codec = QTextCodec::codecForName("utf-8");
273  QTextCodec::setCodecForLocale(codec);
274 #endif
275 }
276 
277 void QUIWidget::sleep(int sec) {
278  QTime dieTime = QTime::currentTime().addMSecs(sec);
279 
280  while (QTime::currentTime() < dieTime) {
281  QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
282  }
283 }
284 
285 void QUIWidget::setSystemDateTime(const QString &year,
286  const QString &month,
287  const QString &day,
288  const QString &hour,
289  const QString &min,
290  const QString &sec) {
291 #ifdef Q_OS_WIN
292  QProcess p(0);
293  p.start("cmd");
294  p.waitForStarted();
295  p.write(QString("date %1-%2-%3\n")
296  .arg(year)
297  .arg(month)
298  .arg(day)
299  .toLatin1());
300  p.closeWriteChannel();
301  p.waitForFinished(1000);
302  p.close();
303  p.start("cmd");
304  p.waitForStarted();
305  p.write(QString("time %1:%2:%3.00\n")
306  .arg(hour)
307  .arg(min)
308  .arg(sec)
309  .toLatin1());
310  p.closeWriteChannel();
311  p.waitForFinished(1000);
312  p.close();
313 #else
314  QString cmd = QString("date %1%2%3%4%5.%6")
315  .arg(month)
316  .arg(day)
317  .arg(hour)
318  .arg(min)
319  .arg(year)
320  .arg(sec);
321  if (system(cmd.toLatin1()) > 0) {
322  }
323  if (system("hwclock -w") > 0) {
324  }
325 #endif
326 }
327 
328 void QUIWidget::runWithSystem(const QString &strName,
329  const QString &strPath,
330  bool autoRun) {
331 #ifdef Q_OS_WIN
332  QSettings reg(
333  "HKEY_LOCAL_"
334  "MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
335  QSettings::NativeFormat);
336 
337  if (autoRun) {
338  reg.setValue(strName, strPath);
339  } else {
340  reg.setValue(strName, "");
341  }
342 #endif
343 }
344 
345 bool QUIWidget::isIP(const QString &ip) {
346  // Use QtCompat for Qt5/Qt6 compatibility
347  QtCompatRegExp RegExp(
348  "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?"
349  "\\d\\d?)");
350 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
351  QRegularExpressionMatch match = RegExp.match(ip);
352  return match.hasMatch();
353 #else
354  return RegExp.exactMatch(ip);
355 #endif
356 }
357 
358 bool QUIWidget::isMac(const QString &mac) {
359  // Use QtCompat for Qt5/Qt6 compatibility
360  QtCompatRegExp RegExp("^[A-F0-9]{2}(-[A-F0-9]{2}){5}$");
361 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
362  QRegularExpressionMatch match = RegExp.match(mac);
363  return match.hasMatch();
364 #else
365  return RegExp.exactMatch(mac);
366 #endif
367 }
368 
369 bool QUIWidget::isTel(const QString &tel) {
370  if (tel.length() != 11) {
371  return false;
372  }
373 
374  if (!tel.startsWith("13") && !tel.startsWith("14") &&
375  !tel.startsWith("15") && !tel.startsWith("18")) {
376  return false;
377  }
378 
379  return true;
380 }
381 
382 bool QUIWidget::isEmail(const QString &email) {
383  if (!email.contains("@") || !email.contains(".com")) {
384  return false;
385  }
386 
387  return true;
388 }
389 
390 int QUIWidget::strHexToDecimal(const QString &strHex) {
391  bool ok;
392  return strHex.toInt(&ok, 16);
393 }
394 
395 int QUIWidget::strDecimalToDecimal(const QString &strDecimal) {
396  bool ok;
397  return strDecimal.toInt(&ok, 10);
398 }
399 
400 int QUIWidget::strBinToDecimal(const QString &strBin) {
401  bool ok;
402  return strBin.toInt(&ok, 2);
403 }
404 
405 QString QUIWidget::strHexToStrBin(const QString &strHex) {
406  uchar decimal = strHexToDecimal(strHex);
407  QString bin = QString::number(decimal, 2);
408  uchar len = bin.length();
409 
410  if (len < 8) {
411  for (int i = 0; i < 8 - len; i++) {
412  bin = "0" + bin;
413  }
414  }
415 
416  return bin;
417 }
418 
419 QString QUIWidget::decimalToStrBin1(int decimal) {
420  QString bin = QString::number(decimal, 2);
421  uchar len = bin.length();
422 
423  if (len <= 8) {
424  for (int i = 0; i < 8 - len; i++) {
425  bin = "0" + bin;
426  }
427  }
428 
429  return bin;
430 }
431 
432 QString QUIWidget::decimalToStrBin2(int decimal) {
433  QString bin = QString::number(decimal, 2);
434  uchar len = bin.length();
435 
436  if (len <= 16) {
437  for (int i = 0; i < 16 - len; i++) {
438  bin = "0" + bin;
439  }
440  }
441 
442  return bin;
443 }
444 
445 QString QUIWidget::decimalToStrHex(int decimal) {
446  QString temp = QString::number(decimal, 16);
447 
448  if (temp.length() == 1) {
449  temp = "0" + temp;
450  }
451 
452  return temp;
453 }
454 
455 QByteArray QUIWidget::intToByte(int i) {
456  QByteArray result;
457  result.resize(4);
458  result[3] = (uchar)(0x000000ff & i);
459  result[2] = (uchar)((0x0000ff00 & i) >> 8);
460  result[1] = (uchar)((0x00ff0000 & i) >> 16);
461  result[0] = (uchar)((0xff000000 & i) >> 24);
462  return result;
463 }
464 
465 int QUIWidget::byteToInt(const QByteArray &data) {
466  int i = data.at(3) & 0x000000FF;
467  i |= ((data.at(2) << 8) & 0x0000FF00);
468  i |= ((data.at(1) << 16) & 0x00FF0000);
469  i |= ((data.at(0) << 24) & 0xFF000000);
470  return i;
471 }
472 
474  QByteArray result;
475  result.resize(2);
476  result[1] = (uchar)(0x000000ff & i);
477  result[0] = (uchar)((0x0000ff00 & i) >> 8);
478  return result;
479 }
480 
481 int QUIWidget::byteToUShort(const QByteArray &data) {
482  int i = data.at(1) & 0x000000FF;
483  i |= ((data.at(0) << 8) & 0x0000FF00);
484  return i;
485 }
486 
487 QString QUIWidget::getXorEncryptDecrypt(const QString &str, char key) {
488  QByteArray data = str.toLatin1();
489  int size = data.size();
490 
491  for (int i = 0; i < size; i++) {
492  data[i] = data.at(i) ^ key;
493  }
494 
495  return QLatin1String(data);
496 }
497 
498 uchar QUIWidget::getOrCode(const QByteArray &data) {
499  int len = data.length();
500  uchar result = 0;
501 
502  for (int i = 0; i < len; i++) {
503  result ^= data.at(i);
504  }
505 
506  return result;
507 }
508 
509 uchar QUIWidget::getCheckCode(const QByteArray &data) {
510  int len = data.length();
511  uchar temp = 0;
512 
513  for (uchar i = 0; i < len; i++) {
514  temp += data.at(i);
515  }
516 
517  return temp % 256;
518 }
519 
520 QString QUIWidget::byteArrayToAsciiStr(const QByteArray &data) {
521  QString temp;
522  int len = data.size();
523 
524  for (int i = 0; i < len; i++) {
525  // 0x20 is space, characters below space are invisible
526  char b = data.at(i);
527 
528  if (0x00 == b) {
529  temp += QString("\\NUL");
530  } else if (0x01 == b) {
531  temp += QString("\\SOH");
532  } else if (0x02 == b) {
533  temp += QString("\\STX");
534  } else if (0x03 == b) {
535  temp += QString("\\ETX");
536  } else if (0x04 == b) {
537  temp += QString("\\EOT");
538  } else if (0x05 == b) {
539  temp += QString("\\ENQ");
540  } else if (0x06 == b) {
541  temp += QString("\\ACK");
542  } else if (0x07 == b) {
543  temp += QString("\\BEL");
544  } else if (0x08 == b) {
545  temp += QString("\\BS");
546  } else if (0x09 == b) {
547  temp += QString("\\HT");
548  } else if (0x0A == b) {
549  temp += QString("\\LF");
550  } else if (0x0B == b) {
551  temp += QString("\\VT");
552  } else if (0x0C == b) {
553  temp += QString("\\FF");
554  } else if (0x0D == b) {
555  temp += QString("\\CR");
556  } else if (0x0E == b) {
557  temp += QString("\\SO");
558  } else if (0x0F == b) {
559  temp += QString("\\SI");
560  } else if (0x10 == b) {
561  temp += QString("\\DLE");
562  } else if (0x11 == b) {
563  temp += QString("\\DC1");
564  } else if (0x12 == b) {
565  temp += QString("\\DC2");
566  } else if (0x13 == b) {
567  temp += QString("\\DC3");
568  } else if (0x14 == b) {
569  temp += QString("\\DC4");
570  } else if (0x15 == b) {
571  temp += QString("\\NAK");
572  } else if (0x16 == b) {
573  temp += QString("\\SYN");
574  } else if (0x17 == b) {
575  temp += QString("\\ETB");
576  } else if (0x18 == b) {
577  temp += QString("\\CAN");
578  } else if (0x19 == b) {
579  temp += QString("\\EM");
580  } else if (0x1A == b) {
581  temp += QString("\\SUB");
582  } else if (0x1B == b) {
583  temp += QString("\\ESC");
584  } else if (0x1C == b) {
585  temp += QString("\\FS");
586  } else if (0x1D == b) {
587  temp += QString("\\GS");
588  } else if (0x1E == b) {
589  temp += QString("\\RS");
590  } else if (0x1F == b) {
591  temp += QString("\\US");
592  } else if (0x7F == b) {
593  temp += QString("\\x7F");
594  } else if (0x5C == b) {
595  temp += QString("\\x5C");
596  } else if (0x20 >= b) {
597  temp += QString("\\x%1").arg(decimalToStrHex((quint8)b));
598  } else {
599  temp += QString("%1").arg(b);
600  }
601  }
602 
603  return temp.trimmed();
604 }
605 
606 QByteArray QUIWidget::hexStrToByteArray(const QString &str) {
607  QByteArray senddata;
608  int hexdata, lowhexdata;
609  int hexdatalen = 0;
610  int len = str.length();
611  senddata.resize(len / 2);
612  char lstr, hstr;
613 
614  for (int i = 0; i < len;) {
615  hstr = str.at(i).toLatin1();
616 
617  if (hstr == ' ') {
618  i++;
619  continue;
620  }
621 
622  i++;
623 
624  if (i >= len) {
625  break;
626  }
627 
628  lstr = str.at(i).toLatin1();
629  hexdata = convertHexChar(hstr);
630  lowhexdata = convertHexChar(lstr);
631 
632  if ((hexdata == 16) || (lowhexdata == 16)) {
633  break;
634  } else {
635  hexdata = hexdata * 16 + lowhexdata;
636  }
637 
638  i++;
639  senddata[hexdatalen] = (char)hexdata;
640  hexdatalen++;
641  }
642 
643  senddata.resize(hexdatalen);
644  return senddata;
645 }
646 
648  if ((ch >= '0') && (ch <= '9')) {
649  return ch - 0x30;
650  } else if ((ch >= 'A') && (ch <= 'F')) {
651  return ch - 'A' + 10;
652  } else if ((ch >= 'a') && (ch <= 'f')) {
653  return ch - 'a' + 10;
654  } else {
655  return (-1);
656  }
657 }
658 
659 QByteArray QUIWidget::asciiStrToByteArray(const QString &str) {
660  QByteArray buffer;
661  int len = str.length();
662  QString letter;
663  QString hex;
664 
665  for (int i = 0; i < len; i++) {
666  letter = str.at(i);
667 
668  if (letter == "\\") {
669  i++;
670  letter = str.mid(i, 1);
671 
672  if (letter == "x") {
673  i++;
674  hex = str.mid(i, 2);
675  buffer.append(strHexToDecimal(hex));
676  i++;
677  continue;
678  } else if (letter == "N") {
679  i++;
680  hex = str.mid(i, 1);
681 
682  if (hex == "U") {
683  i++;
684  hex = str.mid(i, 1);
685 
686  if (hex == "L") { // NUL=0x00
687  buffer.append((char)0x00);
688  continue;
689  }
690  } else if (hex == "A") {
691  i++;
692  hex = str.mid(i, 1);
693 
694  if (hex == "K") { // NAK=0x15
695  buffer.append(0x15);
696  continue;
697  }
698  }
699  } else if (letter == "S") {
700  i++;
701  hex = str.mid(i, 1);
702 
703  if (hex == "O") {
704  i++;
705  hex = str.mid(i, 1);
706 
707  if (hex == "H") { // SOH=0x01
708  buffer.append(0x01);
709  continue;
710  } else { // SO=0x0E
711  buffer.append(0x0E);
712  i--;
713  continue;
714  }
715  } else if (hex == "T") {
716  i++;
717  hex = str.mid(i, 1);
718 
719  if (hex == "X") { // STX=0x02
720  buffer.append(0x02);
721  continue;
722  }
723  } else if (hex == "I") { // SI=0x0F
724  buffer.append(0x0F);
725  continue;
726  } else if (hex == "Y") {
727  i++;
728  hex = str.mid(i, 1);
729 
730  if (hex == "N") { // SYN=0x16
731  buffer.append(0x16);
732  continue;
733  }
734  } else if (hex == "U") {
735  i++;
736  hex = str.mid(i, 1);
737 
738  if (hex == "B") { // SUB=0x1A
739  buffer.append(0x1A);
740  continue;
741  }
742  }
743  } else if (letter == "E") {
744  i++;
745  hex = str.mid(i, 1);
746 
747  if (hex == "T") {
748  i++;
749  hex = str.mid(i, 1);
750 
751  if (hex == "X") { // ETX=0x03
752  buffer.append(0x03);
753  continue;
754  } else if (hex == "B") { // ETB=0x17
755  buffer.append(0x17);
756  continue;
757  }
758  } else if (hex == "O") {
759  i++;
760  hex = str.mid(i, 1);
761 
762  if (hex == "T") { // EOT=0x04
763  buffer.append(0x04);
764  continue;
765  }
766  } else if (hex == "N") {
767  i++;
768  hex = str.mid(i, 1);
769 
770  if (hex == "Q") { // ENQ=0x05
771  buffer.append(0x05);
772  continue;
773  }
774  } else if (hex == "M") { // EM=0x19
775  buffer.append(0x19);
776  continue;
777  } else if (hex == "S") {
778  i++;
779  hex = str.mid(i, 1);
780 
781  if (hex == "C") { // ESC=0x1B
782  buffer.append(0x1B);
783  continue;
784  }
785  }
786  } else if (letter == "A") {
787  i++;
788  hex = str.mid(i, 1);
789 
790  if (hex == "C") {
791  i++;
792  hex = str.mid(i, 1);
793 
794  if (hex == "K") { // ACK=0x06
795  buffer.append(0x06);
796  continue;
797  }
798  }
799  } else if (letter == "B") {
800  i++;
801  hex = str.mid(i, 1);
802 
803  if (hex == "E") {
804  i++;
805  hex = str.mid(i, 1);
806 
807  if (hex == "L") { // BEL=0x07
808  buffer.append(0x07);
809  continue;
810  }
811  } else if (hex == "S") { // BS=0x08
812  buffer.append(0x08);
813  continue;
814  }
815  } else if (letter == "C") {
816  i++;
817  hex = str.mid(i, 1);
818 
819  if (hex == "R") { // CR=0x0D
820  buffer.append(0x0D);
821  continue;
822  } else if (hex == "A") {
823  i++;
824  hex = str.mid(i, 1);
825 
826  if (hex == "N") { // CAN=0x18
827  buffer.append(0x18);
828  continue;
829  }
830  }
831  } else if (letter == "D") {
832  i++;
833  hex = str.mid(i, 1);
834 
835  if (hex == "L") {
836  i++;
837  hex = str.mid(i, 1);
838 
839  if (hex == "E") { // DLE=0x10
840  buffer.append(0x10);
841  continue;
842  }
843  } else if (hex == "C") {
844  i++;
845  hex = str.mid(i, 1);
846 
847  if (hex == "1") { // DC1=0x11
848  buffer.append(0x11);
849  continue;
850  } else if (hex == "2") { // DC2=0x12
851  buffer.append(0x12);
852  continue;
853  } else if (hex == "3") { // DC3=0x13
854  buffer.append(0x13);
855  continue;
856  } else if (hex == "4") { // DC2=0x14
857  buffer.append(0x14);
858  continue;
859  }
860  }
861  } else if (letter == "F") {
862  i++;
863  hex = str.mid(i, 1);
864 
865  if (hex == "F") { // FF=0x0C
866  buffer.append(0x0C);
867  continue;
868  } else if (hex == "S") { // FS=0x1C
869  buffer.append(0x1C);
870  continue;
871  }
872  } else if (letter == "H") {
873  i++;
874  hex = str.mid(i, 1);
875 
876  if (hex == "T") { // HT=0x09
877  buffer.append(0x09);
878  continue;
879  }
880  } else if (letter == "L") {
881  i++;
882  hex = str.mid(i, 1);
883 
884  if (hex == "F") { // LF=0x0A
885  buffer.append(0x0A);
886  continue;
887  }
888  } else if (letter == "G") {
889  i++;
890  hex = str.mid(i, 1);
891 
892  if (hex == "S") { // GS=0x1D
893  buffer.append(0x1D);
894  continue;
895  }
896  } else if (letter == "R") {
897  i++;
898  hex = str.mid(i, 1);
899 
900  if (hex == "S") { // RS=0x1E
901  buffer.append(0x1E);
902  continue;
903  }
904  } else if (letter == "U") {
905  i++;
906  hex = str.mid(i, 1);
907 
908  if (hex == "S") { // US=0x1F
909  buffer.append(0x1F);
910  continue;
911  }
912  } else if (letter == "V") {
913  i++;
914  hex = str.mid(i, 1);
915 
916  if (hex == "T") { // VT=0x0B
917  buffer.append(0x0B);
918  continue;
919  }
920  } else if (letter == "\\") {
921  // If there are multiple consecutive \\, add the corresponding hex 0x5C for \
922  buffer.append(0x5C);
923  continue;
924  } else {
925  // Also add the \\ before the corresponding \[
926  buffer.append(0x5C);
927  buffer.append(letter.toLatin1());
928  continue;
929  }
930  }
931 
932  buffer.append(str.mid(i, 1).toLatin1());
933  }
934 
935  return buffer;
936 }
937 
938 QString QUIWidget::byteArrayToHexStr(const QByteArray &data) {
939  QString temp = "";
940  QString hex = data.toHex();
941 
942  for (int i = 0; i < hex.length(); i = i + 2) {
943  temp += hex.mid(i, 2) + " ";
944  }
945 
946  return temp.trimmed().toUpper();
947 }
948 
949 QString QUIWidget::getFileName(const QString &filter, QString defaultDir) {
950  return QFileDialog::getOpenFileName(0, QStringLiteral("Select File"),
951  defaultDir, filter);
952 }
953 
954 QStringList QUIWidget::getFileNames(const QString &filter, QString defaultDir) {
955  return QFileDialog::getOpenFileNames(0, QStringLiteral("Select File"),
956  defaultDir, filter);
957 }
958 
960  return QFileDialog::getExistingDirectory();
961  ;
962 }
963 
964 QString QUIWidget::getFileNameWithExtension(const QString &strFilePath) {
965  QFileInfo fileInfo(strFilePath);
966  return fileInfo.fileName();
967 }
968 
969 QStringList QUIWidget::getFolderFileNames(const QStringList &filter) {
970  QStringList fileList;
971  QString strFolder = QFileDialog::getExistingDirectory();
972 
973  if (!strFolder.length() == 0) {
974  QDir myFolder(strFolder);
975 
976  if (myFolder.exists()) {
977  fileList = myFolder.entryList(filter);
978  }
979  }
980 
981  return fileList;
982 }
983 
984 bool QUIWidget::folderIsExist(const QString &strFolder) {
985  QDir tempFolder(strFolder);
986  return tempFolder.exists();
987 }
988 
989 bool QUIWidget::fileIsExist(const QString &strFile) {
990  QFile tempFile(strFile);
991  return tempFile.exists();
992 }
993 
994 bool QUIWidget::copyFile(const QString &sourceFile, const QString &targetFile) {
995  bool ok;
996  ok = QFile::copy(sourceFile, targetFile);
997  // Remove read-only attribute from the copied file
998  ok = QFile::setPermissions(targetFile, QFile::WriteOwner);
999  return ok;
1000 }
1001 
1002 void QUIWidget::deleteDirectory(const QString &path) {
1003  QDir dir(path);
1004 
1005  if (!dir.exists()) {
1006  return;
1007  }
1008 
1009  dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
1010  QFileInfoList fileList = dir.entryInfoList();
1011 
1012  foreach (QFileInfo fi, fileList) {
1013  if (fi.isFile()) {
1014  fi.dir().remove(fi.fileName());
1015  } else {
1016  deleteDirectory(fi.absoluteFilePath());
1017  dir.rmdir(fi.absoluteFilePath());
1018  }
1019  }
1020 }
1021 
1022 // bool QUIWidget::ipLive(const QString &ip, int port, int timeout)
1023 //{
1024 // QTcpSocket tcpClient;
1025 // tcpClient.abort();
1026 // tcpClient.connectToHost(ip, port);
1027 // // If connection timeout, consider it offline
1028 // return tcpClient.waitForConnected(timeout);
1029 // }
1030 //
1031 // QString QUIWidget::getHtml(const QString &url)
1032 //{
1033 // QNetworkAccessManager *manager = new QNetworkAccessManager();
1034 // QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
1035 // QByteArray responseData;
1036 // QEventLoop eventLoop;
1037 // QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop,
1038 // SLOT(quit())); eventLoop.exec(); responseData = reply->readAll(); return
1039 // QString(responseData);
1040 // }
1041 //
1042 // QString QUIWidget::getNetIP(const QString &webCode)
1043 //{
1044 // QString web = webCode;
1045 // web = web.replace(' ', "");
1046 // web = web.replace("\r", "");
1047 // web = web.replace("\n", "");
1048 // QStringList list = web.split("<br/>");
1049 // QString tar = list.at(3);
1050 // QStringList ip = tar.split("=");
1051 // return ip.at(1);
1052 // }
1053 //
1054 // QString QUIWidget::getLocalIP()
1055 //{
1056 // QString ip;
1057 // QList<QHostAddress> addrs = QNetworkInterface::allAddresses();
1058 //
1059 // foreach (QHostAddress addr, addrs) {
1060 // ip = addr.toString();
1061 //
1062 // if (ip != "127.0.0.1") {
1063 // break;
1064 // }
1065 // }
1066 //
1067 // return ip;
1068 // }
1069 //
1070 // QString QUIWidget::urlToIP(const QString &url)
1071 //{
1072 // QHostInfo host = QHostInfo::fromName(url);
1073 // return host.addresses().at(0).toString();
1074 // }
1075 //
1076 // bool QUIWidget::isWebOk()
1077 //{
1078 // // If Baidu IP is reachable, it means internet access is available
1079 // return ipLive("115.239.211.112", 80);
1080 // }
1081 
1082 void QUIWidget::showMessageBoxInfo(const QString &info, int closeSec) {
1083  QUIMessageBox::Instance()->setMessage(info, 0, closeSec);
1084  QUIMessageBox::Instance()->show();
1085 }
1086 
1087 void QUIWidget::showMessageBoxError(const QString &info, int closeSec) {
1088  QUIMessageBox::Instance()->setMessage(info, 2, closeSec);
1089  QUIMessageBox::Instance()->show();
1090 }
1091 
1092 int QUIWidget::showMessageBoxQuestion(const QString &info) {
1093  QUIMessageBox msg;
1094  msg.setMessage(info, 1);
1095  return msg.exec();
1096 }
1097 
1098 QString QUIWidget::showInputBox(bool &ok,
1099  const QString &title,
1100  int type,
1101  int closeSec,
1102  QString defaultValue,
1103  bool pwd) {
1104  QUIInputBox input;
1105  input.setParameter(title, type, closeSec, defaultValue, pwd);
1106  ok = input.exec();
1107  return input.getValue();
1108 }
1109 
1110 QUIWidget::QUIWidget(QWidget *parent) : QDialog(parent) {
1111  this->initControl();
1112  this->initForm();
1113 }
1114 
1115 QUIWidget::~QUIWidget() { delete widgetMain; }
1116 
1117 QLabel *QUIWidget::getLabIco() const { return this->labIco; }
1118 
1119 QLabel *QUIWidget::getLabTitle() const { return this->labTitle; }
1120 
1121 QToolButton *QUIWidget::getBtnMenu() const { return this->btnMenu; }
1122 
1123 QPushButton *QUIWidget::getBtnMenuMin() const { return this->btnMenu_Min; }
1124 
1125 QPushButton *QUIWidget::getBtnMenuMax() const { return this->btnMenu_Max; }
1126 
1127 QPushButton *QUIWidget::getBtnMenuMClose() const { return this->btnMenu_Close; }
1128 
1129 QString QUIWidget::getTitle() const { return this->title; }
1130 
1132 
1133 QSize QUIWidget::sizeHint() const { return QSize(600, 450); }
1134 
1135 QSize QUIWidget::minimumSizeHint() const { return QSize(200, 150); }
1136 
1137 void QUIWidget::initControl() {
1138  this->setObjectName(QString::fromUtf8("QUIWidget"));
1139  this->resize(900, 750);
1140  verticalLayout1 = new QVBoxLayout(this);
1141  verticalLayout1->setSpacing(0);
1142  verticalLayout1->setContentsMargins(11, 11, 11, 11);
1143  verticalLayout1->setObjectName(QString::fromUtf8("verticalLayout1"));
1144  verticalLayout1->setContentsMargins(1, 1, 1, 1);
1145  widgetMain = new QWidget(this);
1146  widgetMain->setObjectName(QString::fromUtf8("widgetMain"));
1147  widgetMain->setStyleSheet(QString::fromUtf8(""));
1148  verticalLayout2 = new QVBoxLayout(widgetMain);
1149  verticalLayout2->setSpacing(0);
1150  verticalLayout2->setContentsMargins(11, 11, 11, 11);
1151  verticalLayout2->setObjectName(QString::fromUtf8("verticalLayout2"));
1152  verticalLayout2->setContentsMargins(0, 0, 0, 0);
1153  widgetTitle = new QWidget(widgetMain);
1154  widgetTitle->setObjectName(QString::fromUtf8("widgetTitle"));
1155  QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
1156  sizePolicy.setHorizontalStretch(0);
1157  sizePolicy.setVerticalStretch(0);
1158  sizePolicy.setHeightForWidth(widgetTitle->sizePolicy().hasHeightForWidth());
1159  widgetTitle->setSizePolicy(sizePolicy);
1160  widgetTitle->setMinimumSize(QSize(0, 30));
1161  horizontalLayout4 = new QHBoxLayout(widgetTitle);
1162  horizontalLayout4->setSpacing(0);
1163  horizontalLayout4->setContentsMargins(11, 11, 11, 11);
1164  horizontalLayout4->setObjectName(QString::fromUtf8("horizontalLayout4"));
1165  horizontalLayout4->setContentsMargins(0, 0, 0, 0);
1166  labIco = new QLabel(widgetTitle);
1167  labIco->setObjectName(QString::fromUtf8("labIco"));
1168  QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Preferred);
1169  sizePolicy1.setHorizontalStretch(0);
1170  sizePolicy1.setVerticalStretch(0);
1171  sizePolicy1.setHeightForWidth(labIco->sizePolicy().hasHeightForWidth());
1172  labIco->setSizePolicy(sizePolicy1);
1173  labIco->setMinimumSize(QSize(30, 0));
1174  labIco->setAlignment(Qt::AlignCenter);
1175 
1176  horizontalLayout4->addWidget(labIco);
1177 
1178  labTitle = new QLabel(widgetTitle);
1179  labTitle->setObjectName(QString::fromUtf8("labTitle"));
1180  QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Preferred);
1181  sizePolicy2.setHorizontalStretch(0);
1182  sizePolicy2.setVerticalStretch(0);
1183  sizePolicy2.setHeightForWidth(labTitle->sizePolicy().hasHeightForWidth());
1184  labTitle->setSizePolicy(sizePolicy2);
1185  labTitle->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignVCenter);
1186 
1187  horizontalLayout4->addWidget(labTitle);
1188 
1189  widgetMenu = new QWidget(widgetTitle);
1190  widgetMenu->setObjectName(QString::fromUtf8("widgetMenu"));
1191  sizePolicy1.setHeightForWidth(widgetMenu->sizePolicy().hasHeightForWidth());
1192  widgetMenu->setSizePolicy(sizePolicy1);
1193  horizontalLayout = new QHBoxLayout(widgetMenu);
1194  horizontalLayout->setSpacing(0);
1195  horizontalLayout->setContentsMargins(11, 11, 11, 11);
1196  horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
1197  horizontalLayout->setContentsMargins(0, 0, 0, 0);
1198  btnMenu = new QToolButton(widgetMenu);
1199  btnMenu->setObjectName(QString::fromUtf8("btnMenu"));
1200  QSizePolicy sizePolicy3(QSizePolicy::Fixed, QSizePolicy::Expanding);
1201  sizePolicy3.setHorizontalStretch(0);
1202  sizePolicy3.setVerticalStretch(0);
1203  sizePolicy3.setHeightForWidth(btnMenu->sizePolicy().hasHeightForWidth());
1204  btnMenu->setSizePolicy(sizePolicy3);
1205  btnMenu->setMinimumSize(QSize(30, 0));
1206  btnMenu->setMaximumSize(QSize(30, 16777215));
1207  btnMenu->setFocusPolicy(Qt::NoFocus);
1208  btnMenu->setPopupMode(QToolButton::InstantPopup);
1209 
1210  horizontalLayout->addWidget(btnMenu);
1211 
1212  btnMenu_Min = new QPushButton(widgetMenu);
1213  btnMenu_Min->setObjectName(QString::fromUtf8("btnMenu_Min"));
1214  QSizePolicy sizePolicy4(QSizePolicy::Minimum, QSizePolicy::Expanding);
1215  sizePolicy4.setHorizontalStretch(0);
1216  sizePolicy4.setVerticalStretch(0);
1217  sizePolicy4.setHeightForWidth(
1218  btnMenu_Min->sizePolicy().hasHeightForWidth());
1219  btnMenu_Min->setSizePolicy(sizePolicy4);
1220  btnMenu_Min->setMinimumSize(QSize(30, 0));
1221  btnMenu_Min->setMaximumSize(QSize(30, 16777215));
1222  btnMenu_Min->setCursor(QCursor(Qt::ArrowCursor));
1223  btnMenu_Min->setFocusPolicy(Qt::NoFocus);
1224 
1225  horizontalLayout->addWidget(btnMenu_Min);
1226 
1227  btnMenu_Max = new QPushButton(widgetMenu);
1228  btnMenu_Max->setObjectName(QString::fromUtf8("btnMenu_Max"));
1229  sizePolicy3.setHeightForWidth(
1230  btnMenu_Max->sizePolicy().hasHeightForWidth());
1231  btnMenu_Max->setSizePolicy(sizePolicy3);
1232  btnMenu_Max->setMinimumSize(QSize(30, 0));
1233  btnMenu_Max->setMaximumSize(QSize(30, 16777215));
1234  btnMenu_Max->setCursor(QCursor(Qt::ArrowCursor));
1235  btnMenu_Max->setFocusPolicy(Qt::NoFocus);
1236 
1237  horizontalLayout->addWidget(btnMenu_Max);
1238 
1239  btnMenu_Close = new QPushButton(widgetMenu);
1240  btnMenu_Close->setObjectName(QString::fromUtf8("btnMenu_Close"));
1241  sizePolicy3.setHeightForWidth(
1242  btnMenu_Close->sizePolicy().hasHeightForWidth());
1243  btnMenu_Close->setSizePolicy(sizePolicy3);
1244  btnMenu_Close->setMinimumSize(QSize(30, 0));
1245  btnMenu_Close->setMaximumSize(QSize(30, 16777215));
1246  btnMenu_Close->setCursor(QCursor(Qt::ArrowCursor));
1247  btnMenu_Close->setFocusPolicy(Qt::NoFocus);
1248 
1249  horizontalLayout->addWidget(btnMenu_Close);
1250  horizontalLayout4->addWidget(widgetMenu);
1251  verticalLayout2->addWidget(widgetTitle);
1252 
1253  widget = new QWidget(widgetMain);
1254  widget->setObjectName(QString::fromUtf8("widget"));
1255  verticalLayout3 = new QVBoxLayout(widget);
1256  verticalLayout3->setSpacing(0);
1257  verticalLayout3->setContentsMargins(11, 11, 11, 11);
1258  verticalLayout3->setObjectName(QString::fromUtf8("verticalLayout3"));
1259  verticalLayout3->setContentsMargins(0, 0, 0, 0);
1260 
1261  verticalLayout2->addWidget(widget);
1262  verticalLayout1->addWidget(widgetMain);
1263 
1264  connect(this->btnMenu_Min, SIGNAL(clicked(bool)), this,
1265  SLOT(on_btnMenu_Min_clicked()));
1266  connect(this->btnMenu_Max, SIGNAL(clicked(bool)), this,
1267  SLOT(on_btnMenu_Max_clicked()));
1268  connect(this->btnMenu_Close, SIGNAL(clicked(bool)), this,
1269  SLOT(on_btnMenu_Close_clicked()));
1270 }
1271 
1272 void QUIWidget::initForm() {
1273  // Set icon font
1279 
1280  this->max = false;
1281  this->location = this->geometry();
1282  this->setProperty("form", true);
1283  this->widgetTitle->setProperty("form", "title");
1284  // this->setWindowOpacity(0.8);
1285  this->setWindowFlags((Qt::FramelessWindowHint | Qt::WindowSystemMenuHint |
1286  Qt::WindowMinMaxButtonsHint));
1287 
1288  // Set title and alignment
1289  title = "QUI Demo";
1290  alignment = Qt::AlignLeft | Qt::AlignVCenter;
1291  minHide = false;
1292  mainWidget = nullptr;
1293 
1295 
1296  // Install event filter to monitor mouse movement
1297  this->installEventFilter(this);
1298  this->widgetTitle->installEventFilter(this);
1299 
1300  // Add theme menu
1301  QStringList name;
1302  name << QStringLiteral("Silvery") << QStringLiteral("Blue")
1303  << QStringLiteral("Light Blue") << QStringLiteral("Dark Blue")
1304  << QStringLiteral("Gray") << QStringLiteral("Light Gray")
1305  << QStringLiteral("Dark Gray") << QStringLiteral("Black")
1306  << QStringLiteral("Light Black") << QStringLiteral("Dark Black")
1307  << QStringLiteral("PS Black") << QStringLiteral("Flat Black")
1308  << QStringLiteral("Flat White");
1309 
1310  foreach (QString str, name) {
1311  QAction *action = new QAction(str, this);
1312  this->btnMenu->addAction(action);
1313  connect(action, SIGNAL(triggered(bool)), this, SLOT(changeStyle()));
1314  }
1315 }
1316 
1318  restoreWinAction = new QAction(tr("restore(&R)"), this);
1319  quitAction = new QAction(tr("exit(&Q)"), this);
1320 
1321  // Restore window
1322  connect(restoreWinAction, SIGNAL(triggered(bool)), this,
1323  SLOT(showWindow()));
1324 
1325  // Quit application
1326  connect(quitAction, SIGNAL(triggered(bool)), qApp, SLOT(quit()));
1327 
1328  // Add menu
1329  // Qt5/Qt6 Compatibility: QDesktopWidget removed in Qt6
1330 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1331  trayMenu = new QMenu(nullptr);
1332 #else
1333  trayMenu = new QMenu((QWidget *)QApplication::desktop());
1334 #endif
1335  trayMenu->addAction(restoreWinAction); // Bind control to menu
1336 
1337  // Add separator
1338  trayMenu->addSeparator();
1339  trayMenu->addAction(quitAction);
1340 
1341  // Check if system supports system tray icon
1342  if (!QSystemTrayIcon::isSystemTrayAvailable()) {
1343  return;
1344  }
1345 
1346  // Instantiate system tray icon control
1347  m_systemTray = new QSystemTrayIcon(this);
1348  m_systemTray->setIcon(QIcon(Settings::APP_LOGO)); // Set system tray icon
1349  m_systemTray->setToolTip(Settings::TITLE); // Show tooltip
1350  m_systemTray->showMessage(QStringLiteral("Tray"),
1351  QStringLiteral("Tray Management"),
1352  QSystemTrayIcon::Information, 10000);
1353  m_systemTray->setContextMenu(trayMenu); // Bind tray menu
1354  m_systemTray->show(); // Show icon in taskbar
1355 
1356  connect(m_systemTray, &QSystemTrayIcon::activated, this,
1357  &QUIWidget::activeTray); // Click tray to execute corresponding
1358  // action
1359  connect(m_systemTray, &QSystemTrayIcon::messageClicked, this,
1360  &QUIWidget::showWindow); // Click message box to show main window
1361 }
1362 
1363 void QUIWidget::activeTray(QSystemTrayIcon::ActivationReason reason) {
1364  switch (reason) {
1365  // case QSystemTrayIcon::Context:
1366  // showWindow();
1367  // break;
1368  case QSystemTrayIcon::DoubleClick:
1369  showWindow();
1370  break;
1372  m_systemTray->showMessage(
1373  "Information", // Message window title
1374  "There is a new message!", // Message content
1375  QSystemTrayIcon::MessageIcon::Information, // Message
1376  // window icon
1377  5000); // Message window display duration
1378  break;
1379  }
1380 }
1381 
1382 void QUIWidget::changeStyle() {
1383  QAction *act = (QAction *)sender();
1384  QString name = act->text();
1385  QString qssFile = ":/qss/blue.css";
1386 
1387  if (name == QStringLiteral("Silvery")) {
1388  qssFile = ":/qss/silvery.css";
1390  } else if (name == QStringLiteral("Blue")) {
1391  qssFile = ":/qss/blue.css";
1393  } else if (name == QStringLiteral("Light Blue")) {
1394  qssFile = ":/qss/lightblue.css";
1396  } else if (name == QStringLiteral("Dark Blue")) {
1397  qssFile = ":/qss/darkblue.css";
1399  } else if (name == QStringLiteral("Gray")) {
1400  qssFile = ":/qss/gray.css";
1402  } else if (name == QStringLiteral("Light Gray")) {
1403  qssFile = ":/qss/lightgray.css";
1405  } else if (name == QStringLiteral("Dark Gray")) {
1406  qssFile = ":/qss/darkgray.css";
1408  } else if (name == QStringLiteral("Black")) {
1409  qssFile = ":/qss/black.css";
1411  } else if (name == QStringLiteral("Light Black")) {
1412  qssFile = ":/qss/lightblack.css";
1414  } else if (name == QStringLiteral("Dark Black")) {
1415  qssFile = ":/qss/darkblack.css";
1417  } else if (name == QStringLiteral("PS Black")) {
1418  qssFile = ":/qss/psblack.css";
1420  } else if (name == QStringLiteral("Flat Black")) {
1421  qssFile = ":/qss/flatblack.css";
1423  } else if (name == QStringLiteral("Flat White")) {
1424  qssFile = ":/qss/flatwhite.css";
1426  }
1427 
1429  qssFile);
1430 
1431  emit changeStyle(qssFile);
1432 }
1433 
1434 void QUIWidget::setIcon(QUIWidget::Widget widget, QChar str, quint32 size) {
1435  if (widget == QUIWidget::Lab_Ico) {
1436  setIconMain(str, size);
1437  } else if (widget == QUIWidget::BtnMenu) {
1438  QUIConfig::IconMenu = str;
1439  IconHelper::Instance()->setIcon(this->btnMenu, str, size);
1440  } else if (widget == QUIWidget::BtnMenu_Min) {
1441  QUIConfig::IconMin = str;
1442  IconHelper::Instance()->setIcon(this->btnMenu_Min, str, size);
1443  } else if (widget == QUIWidget::BtnMenu_Max) {
1444  QUIConfig::IconMax = str;
1445  IconHelper::Instance()->setIcon(this->btnMenu_Max, str, size);
1446  } else if (widget == QUIWidget::BtnMenu_Normal) {
1447  QUIConfig::IconNormal = str;
1448  IconHelper::Instance()->setIcon(this->btnMenu_Max, str, size);
1449  } else if (widget == QUIWidget::BtnMenu_Close) {
1450  QUIConfig::IconClose = str;
1451  IconHelper::Instance()->setIcon(this->btnMenu_Close, str, size);
1452  }
1453 }
1454 
1455 void QUIWidget::setIconMain(QChar str, quint32 size) {
1456  QUIConfig::IconMain = str;
1457  IconHelper::Instance()->setIcon(this->labIco, str, size);
1460 }
1461 
1462 void QUIWidget::setWindowLogo(const QString &icon) {
1463  if (this->mainWidget) {
1464  this->mainWidget->setWindowIcon(QIcon(icon));
1465  }
1466 }
1467 
1469  const QString &file,
1470  const QSize &size) {
1471  QPixmap pix = QPixmap(file);
1472  // Auto-scale according to aspect ratio
1473  pix = pix.scaled(size, Qt::KeepAspectRatio);
1474 
1475  if (widget == QUIWidget::Lab_Ico) {
1476  this->labIco->setPixmap(pix);
1477  } else if (widget == QUIWidget::BtnMenu) {
1478  this->btnMenu->setIcon(QIcon(file));
1479  } else if (widget == QUIWidget::BtnMenu_Min) {
1480  this->btnMenu_Min->setIcon(QIcon(file));
1481  } else if (widget == QUIWidget::BtnMenu_Max) {
1482  this->btnMenu_Max->setIcon(QIcon(file));
1483  } else if (widget == QUIWidget::BtnMenu_Close) {
1484  this->btnMenu_Close->setIcon(QIcon(file));
1485  }
1486 }
1487 
1488 void QUIWidget::setVisible(QUIWidget::Widget widget, bool visible) {
1489  if (widget == QUIWidget::Lab_Ico) {
1490  this->labIco->setVisible(visible);
1491  } else if (widget == QUIWidget::BtnMenu) {
1492  this->btnMenu->setVisible(visible);
1493  } else if (widget == QUIWidget::BtnMenu_Min) {
1494  this->btnMenu_Min->setVisible(visible);
1495  } else if (widget == QUIWidget::BtnMenu_Max) {
1496  this->btnMenu_Max->setVisible(visible);
1497  } else if (widget == QUIWidget::BtnMenu_Close) {
1498  this->btnMenu_Close->setVisible(visible);
1499  }
1500 }
1501 
1503  this->btnMenu->setVisible(false);
1504  this->btnMenu_Min->setVisible(false);
1505  this->btnMenu_Max->setVisible(false);
1506 }
1507 
1509  this->widgetTitle->setFixedHeight(height);
1510 }
1511 
1513  this->labIco->setFixedWidth(width);
1514  this->btnMenu->setFixedWidth(width);
1515  this->btnMenu_Min->setFixedWidth(width);
1516  this->btnMenu_Max->setFixedWidth(width);
1517  this->btnMenu_Close->setFixedWidth(width);
1518 }
1519 
1520 void QUIWidget::setTitle(const QString &title) {
1521  if (this->title != title) {
1522  this->title = title;
1523  this->labTitle->setText(title);
1524  this->setWindowTitle(this->labTitle->text());
1525  }
1526 }
1527 
1529  if (this->alignment != alignment) {
1530  this->alignment = alignment;
1531  this->labTitle->setAlignment(alignment);
1532  }
1533 }
1534 
1535 void QUIWidget::setMinHide(bool minHide) {
1536  if (this->minHide != minHide) {
1537  this->minHide = minHide;
1538  }
1539 }
1540 
1542  // A QUI widget object can only set one main widget
1543  if (this->mainWidget == 0) {
1544  // Add child widget to layout
1545  this->widget->layout()->addWidget(mainWidget);
1546  // Auto-set size
1547  resize(mainWidget->width(),
1548  mainWidget->height() + this->widgetTitle->height());
1549 
1550  this->mainWidget = mainWidget;
1551  }
1552 }
1553 
1554 void QUIWidget::showEvent(QShowEvent *event) {
1555  QDialog::showEvent(event);
1556 
1557  if (this->mainWidget) {
1558  if (!this->mainWidget->m_FirstShow) {
1559  return;
1560  }
1561 
1562  QVariant geometry = ecvSettingManager::getValue(
1564 
1565  if (geometry.isValid()) {
1566  this->mainWidget->restoreGeometry(geometry.toByteArray());
1567  this->mainWidget->restoreState(
1570  .toByteArray());
1571  }
1572 
1573  this->mainWidget->m_FirstShow = false;
1574 
1575  if (!geometry.isValid()) {
1576  showMaximized();
1577  }
1578 
1579  if (isFullScreen()) {
1580  this->mainWidget->updateFullScreenMenu(true);
1581  }
1582  }
1583 }
1584 
1585 void QUIWidget::closeEvent(QCloseEvent *event) {
1586  if (this->mainWidget) {
1587  if ((this->mainWidget->db() &&
1588  this->mainWidget->db()->getRootEntity()->getChildrenNumber() ==
1589  0) ||
1590  QMessageBox::question(this, "Quit",
1591  "Are you sure you want to quit?",
1592  QMessageBox::Ok,
1593  QMessageBox::Cancel) != QMessageBox::Cancel) {
1594  event->accept();
1595  } else {
1596  event->ignore();
1597  }
1598 
1600  this->mainWidget->saveGUIElementsPos();
1601  }
1602  }
1603 }
1604 
1605 void QUIWidget::moveEvent(QMoveEvent *event) {
1606  QDialog::moveEvent(event);
1607 
1608  if (this->mainWidget) {
1609  this->mainWidget->updateOverlayDialogsPlacement();
1610  }
1611 }
1612 
1613 void QUIWidget::resizeEvent(QResizeEvent *event) {
1614  QDialog::resizeEvent(event);
1615 
1616  if (this->mainWidget) {
1617  this->mainWidget->updateOverlayDialogsPlacement();
1618  }
1619 }
1620 
1621 void QUIWidget::keyPressEvent(QKeyEvent *event) {
1622  switch (event->key()) {
1623  case Qt::Key_Escape: {
1624  if (this->mainWidget) {
1625  this->mainWidget->cancelPreviousPickingOperation(true);
1626  }
1627 
1628  break;
1629  }
1630 
1631  default:
1632  QDialog::keyPressEvent(event);
1633  }
1634 }
1635 
1636 bool QUIWidget::eventFilter(QObject *obj, QEvent *evt) {
1637  switch (evt->type()) {
1638  case QEvent::Resize:
1639  case QEvent::Move:
1640  if (this->mainWidget) {
1641  this->mainWidget->updateOverlayDialogsPlacement();
1642  }
1643  break;
1644  default:
1645  // nothing to do
1646  break;
1647  }
1648 
1649  static QPoint mousePoint;
1650  static bool mousePressed = false;
1651 
1652  QMouseEvent *event = static_cast<QMouseEvent *>(evt);
1653  if (event->type() == QEvent::MouseButtonPress) {
1654  if (event->button() == Qt::LeftButton) {
1655  mousePressed = true;
1656  mousePoint = event->globalPos() - this->pos();
1657  return true;
1658  }
1659  } else if (event->type() == QEvent::MouseButtonRelease) {
1660  mousePressed = false;
1661  return true;
1662  } else if (event->type() == QEvent::MouseMove) {
1663  if (!max && mousePressed && (event->buttons() && Qt::LeftButton)) {
1664  this->move(event->globalPos() - mousePoint);
1665  return true;
1666  }
1667  } else if (event->type() == QEvent::MouseButtonDblClick) {
1668  // if (this->btnMenu_Max->isVisible() && obj == this->widgetTitle) {
1669  if (this->btnMenu_Max->isVisible()) {
1670  this->on_btnMenu_Max_clicked();
1671  return true;
1672  }
1673  }
1674 
1675  QObject::eventFilter(obj, evt);
1676 
1677  return QWidget::eventFilter(obj, evt);
1678 }
1679 
1680 void QUIWidget::on_btnMenu_Min_clicked() {
1681  if (minHide) {
1682  hide();
1683  } else {
1684  showMinimized();
1685  }
1686 }
1687 
1688 void QUIWidget::on_btnMenu_Max_clicked() {
1689  if (max) {
1690  this->setGeometry(location);
1692  } else {
1693  location = this->geometry();
1694  // this->setGeometry(qApp->desktop()->availableGeometry());
1695  this->setGeometry(qApp->primaryScreen()->geometry());
1697  }
1698 
1699  max = !max;
1700 }
1701 
1702 void QUIWidget::on_btnMenu_Close_clicked() {
1703  emit closing();
1704  exit(0);
1705 }
1706 
1707 QUIMessageBox *QUIMessageBox::self = 0;
1708 QUIMessageBox::QUIMessageBox(QWidget *parent) : QDialog(parent) {
1709  this->initControl();
1710  this->initForm();
1711 }
1712 
1713 QUIMessageBox::~QUIMessageBox() { delete widgetMain; }
1714 
1715 void QUIMessageBox::initControl() {
1716  this->setObjectName(QString::fromUtf8("QUIMessageBox"));
1717 
1718 #ifdef __arm__
1719  this->resize(300, 160);
1720 #else
1721  this->resize(280, 150);
1722 #endif
1723 
1724  verticalLayout1 = new QVBoxLayout(this);
1725  verticalLayout1->setSpacing(0);
1726  verticalLayout1->setObjectName(QString::fromUtf8("verticalLayout1"));
1727  verticalLayout1->setContentsMargins(1, 1, 1, 1);
1728  widgetTitle = new QWidget(this);
1729  widgetTitle->setObjectName(QString::fromUtf8("widgetTitle"));
1730  QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
1731  sizePolicy.setHorizontalStretch(0);
1732  sizePolicy.setVerticalStretch(0);
1733  sizePolicy.setHeightForWidth(widgetTitle->sizePolicy().hasHeightForWidth());
1734  widgetTitle->setSizePolicy(sizePolicy);
1735  widgetTitle->setMinimumSize(QSize(0, 30));
1736  horizontalLayout3 = new QHBoxLayout(widgetTitle);
1737  horizontalLayout3->setSpacing(0);
1738  horizontalLayout3->setObjectName(QString::fromUtf8("horizontalLayout3"));
1739  horizontalLayout3->setContentsMargins(0, 0, 0, 0);
1740  labIco = new QLabel(widgetTitle);
1741  labIco->setObjectName(QString::fromUtf8("labIco"));
1742  QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Preferred);
1743  sizePolicy1.setHorizontalStretch(0);
1744  sizePolicy1.setVerticalStretch(0);
1745  sizePolicy1.setHeightForWidth(labIco->sizePolicy().hasHeightForWidth());
1746  labIco->setSizePolicy(sizePolicy1);
1747  labIco->setMinimumSize(QSize(30, 0));
1748  labIco->setAlignment(Qt::AlignCenter);
1749 
1750  horizontalLayout3->addWidget(labIco);
1751 
1752  labTitle = new QLabel(widgetTitle);
1753  labTitle->setObjectName(QString::fromUtf8("labTitle"));
1754  labTitle->setStyleSheet(QString::fromUtf8(""));
1755  labTitle->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignVCenter);
1756 
1757  horizontalLayout3->addWidget(labTitle);
1758 
1759  labTime = new QLabel(widgetTitle);
1760  labTime->setObjectName(QString::fromUtf8("labTime"));
1761  QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Preferred);
1762  sizePolicy2.setHorizontalStretch(0);
1763  sizePolicy2.setVerticalStretch(0);
1764  sizePolicy2.setHeightForWidth(labTime->sizePolicy().hasHeightForWidth());
1765  labTime->setSizePolicy(sizePolicy2);
1766  labTime->setAlignment(Qt::AlignCenter);
1767 
1768  horizontalLayout3->addWidget(labTime);
1769 
1770  widgetMenu = new QWidget(widgetTitle);
1771  widgetMenu->setObjectName(QString::fromUtf8("widgetMenu"));
1772  sizePolicy1.setHeightForWidth(widgetMenu->sizePolicy().hasHeightForWidth());
1773  widgetMenu->setSizePolicy(sizePolicy1);
1774  horizontalLayout4 = new QHBoxLayout(widgetMenu);
1775  horizontalLayout4->setSpacing(0);
1776  horizontalLayout4->setObjectName(QString::fromUtf8("horizontalLayout4"));
1777  horizontalLayout4->setContentsMargins(0, 0, 0, 0);
1778  btnMenu_Close = new QPushButton(widgetMenu);
1779  btnMenu_Close->setObjectName(QString::fromUtf8("btnMenu_Close"));
1780  QSizePolicy sizePolicy3(QSizePolicy::Minimum, QSizePolicy::Expanding);
1781  sizePolicy3.setHorizontalStretch(0);
1782  sizePolicy3.setVerticalStretch(0);
1783  sizePolicy3.setHeightForWidth(
1784  btnMenu_Close->sizePolicy().hasHeightForWidth());
1785  btnMenu_Close->setSizePolicy(sizePolicy3);
1786  btnMenu_Close->setMinimumSize(QSize(30, 0));
1787  btnMenu_Close->setMaximumSize(QSize(30, 16777215));
1788  btnMenu_Close->setCursor(QCursor(Qt::ArrowCursor));
1789  btnMenu_Close->setFocusPolicy(Qt::NoFocus);
1790  btnMenu_Close->setFlat(true);
1791 
1792  horizontalLayout4->addWidget(btnMenu_Close);
1793  horizontalLayout3->addWidget(widgetMenu);
1794  verticalLayout1->addWidget(widgetTitle);
1795 
1796  widgetMain = new QWidget(this);
1797  widgetMain->setObjectName(QString::fromUtf8("widgetMain"));
1798  widgetMain->setStyleSheet(QString::fromUtf8(""));
1799  verticalLayout2 = new QVBoxLayout(widgetMain);
1800  verticalLayout2->setSpacing(5);
1801  verticalLayout2->setObjectName(QString::fromUtf8("verticalLayout2"));
1802  verticalLayout2->setContentsMargins(5, 5, 5, 5);
1803  frame = new QFrame(widgetMain);
1804  frame->setObjectName(QString::fromUtf8("frame"));
1805  frame->setFrameShape(QFrame::Box);
1806  frame->setFrameShadow(QFrame::Sunken);
1807  verticalLayout4 = new QVBoxLayout(frame);
1808  verticalLayout4->setObjectName(QString::fromUtf8("verticalLayout4"));
1809  verticalLayout4->setContentsMargins(-1, 9, -1, -1);
1810  horizontalLayout1 = new QHBoxLayout();
1811  horizontalLayout1->setObjectName(QString::fromUtf8("horizontalLayout1"));
1812  labIcoMain = new QLabel(frame);
1813  labIcoMain->setObjectName(QString::fromUtf8("labIcoMain"));
1814  labIcoMain->setMinimumSize(QSize(30, 30));
1815  labIcoMain->setMaximumSize(QSize(30, 30));
1816  labIcoMain->setStyleSheet(
1817  QString::fromUtf8("border-image: url(:/image/msg_info.png);"));
1818 
1819  horizontalLayout1->addWidget(labIcoMain);
1820 
1821  horizontalSpacer1 =
1822  new QSpacerItem(5, 0, QSizePolicy::Minimum, QSizePolicy::Minimum);
1823 
1824  horizontalLayout1->addItem(horizontalSpacer1);
1825 
1826  labInfo = new QLabel(frame);
1827  labInfo->setObjectName(QString::fromUtf8("labInfo"));
1828  QSizePolicy sizePolicy4(QSizePolicy::Expanding, QSizePolicy::Expanding);
1829  sizePolicy4.setHorizontalStretch(0);
1830  sizePolicy4.setVerticalStretch(0);
1831  sizePolicy4.setHeightForWidth(labInfo->sizePolicy().hasHeightForWidth());
1832  labInfo->setSizePolicy(sizePolicy4);
1833  labInfo->setMinimumSize(QSize(0, 33));
1834  labInfo->setScaledContents(false);
1835  labInfo->setWordWrap(true);
1836 
1837  horizontalLayout1->addWidget(labInfo);
1838 
1839  verticalLayout4->addLayout(horizontalLayout1);
1840 
1841  horizontalLayout2 = new QHBoxLayout();
1842  horizontalLayout2->setObjectName(QString::fromUtf8("horizontalLayout2"));
1843  horizontalSpacer2 = new QSpacerItem(40, 20, QSizePolicy::Expanding,
1845 
1846  horizontalLayout2->addItem(horizontalSpacer2);
1847 
1848  btnOk = new QPushButton(frame);
1849  btnOk->setObjectName(QString::fromUtf8("btnOk"));
1850  btnOk->setMinimumSize(QSize(80, 0));
1851  btnOk->setFocusPolicy(Qt::StrongFocus);
1852  btnOk->setStyleSheet(QString::fromUtf8(""));
1853  QIcon icon;
1854  icon.addFile(QString::fromUtf8(":/image/btn_ok.png"), QSize(),
1855  QIcon::Normal, QIcon::Off);
1856  btnOk->setIcon(icon);
1857 
1858  horizontalLayout2->addWidget(btnOk);
1859 
1860  btnCancel = new QPushButton(frame);
1861  btnCancel->setObjectName(QString::fromUtf8("btnCancel"));
1862  btnCancel->setMinimumSize(QSize(80, 0));
1863  btnCancel->setFocusPolicy(Qt::StrongFocus);
1864  btnCancel->setStyleSheet(QString::fromUtf8(""));
1865  QIcon icon1;
1866  icon1.addFile(QString::fromUtf8(":/image/btn_close.png"), QSize(),
1867  QIcon::Normal, QIcon::Off);
1868  btnCancel->setIcon(icon1);
1869 
1870  horizontalLayout2->addWidget(btnCancel);
1871  verticalLayout4->addLayout(horizontalLayout2);
1872  verticalLayout2->addWidget(frame);
1873  verticalLayout1->addWidget(widgetMain);
1874 
1875  widgetTitle->raise();
1876  widgetMain->raise();
1877  frame->raise();
1878 
1879  this->btnOk->setText(QStringLiteral("OK"));
1880  this->btnCancel->setText(QStringLiteral("Cancel"));
1881 
1882  connect(this->btnOk, SIGNAL(clicked()), this, SLOT(on_btnOk_clicked()));
1883  connect(this->btnMenu_Close, SIGNAL(clicked(bool)), this,
1884  SLOT(on_btnMenu_Close_clicked()));
1885  connect(this->btnCancel, SIGNAL(clicked()), this,
1886  SLOT(on_btnMenu_Close_clicked()));
1887 }
1888 
1889 void QUIMessageBox::initForm() {
1891  QUIConfig::FontSize + 2);
1894 
1895  this->setProperty("form", true);
1896  this->widgetTitle->setProperty("form", "title");
1897  this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint |
1898  Qt::WindowMinMaxButtonsHint |
1899  Qt::WindowStaysOnTopHint);
1900  this->setFixedSize(280, 150);
1901  this->setWindowTitle(this->labTitle->text());
1902 
1903  int width = 80;
1904  int iconWidth = 18;
1905  int iconHeight = 18;
1906  this->labIcoMain->setFixedSize(30, 30);
1907 
1908  QList<QPushButton *> btns1 = this->frame->findChildren<QPushButton *>();
1909 
1910  foreach (QPushButton *btn, btns1) {
1911  btn->setMinimumWidth(width);
1912  btn->setIconSize(QSize(iconWidth, iconHeight));
1913  }
1914 
1915  closeSec = 0;
1916  currentSec = 0;
1917 
1918  QTimer *timer = new QTimer(this);
1919  timer->setInterval(1000);
1920  connect(timer, SIGNAL(timeout()), this, SLOT(checkSec()));
1921  timer->start();
1922 
1923  this->installEventFilter(this);
1924 }
1925 
1926 void QUIMessageBox::checkSec() {
1927  if (closeSec == 0) {
1928  return;
1929  }
1930 
1931  if (currentSec < closeSec) {
1932  currentSec++;
1933  } else {
1934  this->close();
1935  }
1936 
1937  QString str = QString("关闭倒计时 %1 s").arg(closeSec - currentSec + 1);
1938  this->labTime->setText(str);
1939 }
1940 
1941 void QUIMessageBox::setMessage(const QString &msg, int type, int closeSec) {
1942  this->closeSec = closeSec;
1943  this->currentSec = 0;
1944  this->labTime->clear();
1945 
1946  checkSec();
1947 
1948  if (type == 0) {
1949  this->labIcoMain->setStyleSheet(
1950  "border-image: url(:/image/msg_info.png);");
1951  this->btnCancel->setVisible(false);
1952  this->labTitle->setText(QStringLiteral("Information"));
1953  } else if (type == 1) {
1954  this->labIcoMain->setStyleSheet(
1955  "border-image: url(:/image/msg_question.png);");
1956  this->labTitle->setText(QStringLiteral("Question"));
1957  } else if (type == 2) {
1958  this->labIcoMain->setStyleSheet(
1959  "border-image: url(:/image/msg_error.png);");
1960  this->btnCancel->setVisible(false);
1961  this->labTitle->setText(QStringLiteral("Error"));
1962  }
1963 
1964  this->labInfo->setText(msg);
1965  this->setWindowTitle(this->labTitle->text());
1966 }
1967 
1968 void QUIMessageBox::closeEvent(QCloseEvent *) {
1969  closeSec = 0;
1970  currentSec = 0;
1971 }
1972 
1973 bool QUIMessageBox::eventFilter(QObject *obj, QEvent *evt) {
1974  static QPoint mousePoint;
1975  static bool mousePressed = false;
1976 
1977  QMouseEvent *event = static_cast<QMouseEvent *>(evt);
1978  if (event->type() == QEvent::MouseButtonPress) {
1979  if (event->button() == Qt::LeftButton) {
1980  mousePressed = true;
1981  mousePoint = event->globalPos() - this->pos();
1982  return true;
1983  }
1984  } else if (event->type() == QEvent::MouseButtonRelease) {
1985  mousePressed = false;
1986  return true;
1987  } else if (event->type() == QEvent::MouseMove) {
1988  if (mousePressed && (event->buttons() && Qt::LeftButton)) {
1989  this->move(event->globalPos() - mousePoint);
1990  return true;
1991  }
1992  }
1993 
1994  return QWidget::eventFilter(obj, evt);
1995 }
1996 
1997 void QUIMessageBox::on_btnOk_clicked() {
1998  done(QMessageBox::Yes);
1999  close();
2000 }
2001 
2002 void QUIMessageBox::on_btnMenu_Close_clicked() {
2003  done(QMessageBox::No);
2004  close();
2005 }
2006 
2007 void QUIMessageBox::setIconMain(QChar str, quint32 size) {
2008  IconHelper::Instance()->setIcon(this->labIco, str, size);
2009 }
2010 
2011 QUIInputBox *QUIInputBox::self = 0;
2012 QUIInputBox::QUIInputBox(QWidget *parent) : QDialog(parent) {
2013  this->initControl();
2014  this->initForm();
2015 }
2016 
2017 QUIInputBox::~QUIInputBox() { delete widgetMain; }
2018 
2019 void QUIInputBox::initControl() {
2020  this->setObjectName(QString::fromUtf8("QUIInputBox"));
2021 
2022 #ifdef __arm__
2023  this->resize(300, 160);
2024 #else
2025  this->resize(280, 150);
2026 #endif
2027 
2028  verticalLayout1 = new QVBoxLayout(this);
2029  verticalLayout1->setSpacing(0);
2030  verticalLayout1->setObjectName(QString::fromUtf8("verticalLayout1"));
2031  verticalLayout1->setContentsMargins(1, 1, 1, 1);
2032  widgetTitle = new QWidget(this);
2033  widgetTitle->setObjectName(QString::fromUtf8("widgetTitle"));
2034  QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
2035  sizePolicy.setHorizontalStretch(0);
2036  sizePolicy.setVerticalStretch(0);
2037  sizePolicy.setHeightForWidth(widgetTitle->sizePolicy().hasHeightForWidth());
2038  widgetTitle->setSizePolicy(sizePolicy);
2039  widgetTitle->setMinimumSize(QSize(0, 30));
2040  horizontalLayout1 = new QHBoxLayout(widgetTitle);
2041  horizontalLayout1->setSpacing(0);
2042  horizontalLayout1->setObjectName(QString::fromUtf8("horizontalLayout1"));
2043  horizontalLayout1->setContentsMargins(0, 0, 0, 0);
2044  labIco = new QLabel(widgetTitle);
2045  labIco->setObjectName(QString::fromUtf8("labIco"));
2046  QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Preferred);
2047  sizePolicy1.setHorizontalStretch(0);
2048  sizePolicy1.setVerticalStretch(0);
2049  sizePolicy1.setHeightForWidth(labIco->sizePolicy().hasHeightForWidth());
2050  labIco->setSizePolicy(sizePolicy1);
2051  labIco->setMinimumSize(QSize(30, 0));
2052  labIco->setAlignment(Qt::AlignCenter);
2053 
2054  horizontalLayout1->addWidget(labIco);
2055 
2056  labTitle = new QLabel(widgetTitle);
2057  labTitle->setObjectName(QString::fromUtf8("labTitle"));
2058  labTitle->setStyleSheet(QString::fromUtf8(""));
2059  labTitle->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignVCenter);
2060 
2061  horizontalLayout1->addWidget(labTitle);
2062 
2063  labTime = new QLabel(widgetTitle);
2064  labTime->setObjectName(QString::fromUtf8("labTime"));
2065  QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Preferred);
2066  sizePolicy2.setHorizontalStretch(0);
2067  sizePolicy2.setVerticalStretch(0);
2068  sizePolicy2.setHeightForWidth(labTime->sizePolicy().hasHeightForWidth());
2069  labTime->setSizePolicy(sizePolicy2);
2070  labTime->setAlignment(Qt::AlignCenter);
2071 
2072  horizontalLayout1->addWidget(labTime);
2073 
2074  widgetMenu = new QWidget(widgetTitle);
2075  widgetMenu->setObjectName(QString::fromUtf8("widgetMenu"));
2076  sizePolicy1.setHeightForWidth(widgetMenu->sizePolicy().hasHeightForWidth());
2077  widgetMenu->setSizePolicy(sizePolicy1);
2078  horizontalLayout2 = new QHBoxLayout(widgetMenu);
2079  horizontalLayout2->setSpacing(0);
2080  horizontalLayout2->setObjectName(QString::fromUtf8("horizontalLayout2"));
2081  horizontalLayout2->setContentsMargins(0, 0, 0, 0);
2082  btnMenu_Close = new QPushButton(widgetMenu);
2083  btnMenu_Close->setObjectName(QString::fromUtf8("btnMenu_Close"));
2084  QSizePolicy sizePolicy3(QSizePolicy::Minimum, QSizePolicy::Expanding);
2085  sizePolicy3.setHorizontalStretch(0);
2086  sizePolicy3.setVerticalStretch(0);
2087  sizePolicy3.setHeightForWidth(
2088  btnMenu_Close->sizePolicy().hasHeightForWidth());
2089  btnMenu_Close->setSizePolicy(sizePolicy3);
2090  btnMenu_Close->setMinimumSize(QSize(30, 0));
2091  btnMenu_Close->setMaximumSize(QSize(30, 16777215));
2092  btnMenu_Close->setCursor(QCursor(Qt::ArrowCursor));
2093  btnMenu_Close->setFocusPolicy(Qt::NoFocus);
2094  btnMenu_Close->setFlat(true);
2095 
2096  horizontalLayout2->addWidget(btnMenu_Close);
2097  horizontalLayout1->addWidget(widgetMenu);
2098  verticalLayout1->addWidget(widgetTitle);
2099 
2100  widgetMain = new QWidget(this);
2101  widgetMain->setObjectName(QString::fromUtf8("widgetMain"));
2102  widgetMain->setStyleSheet(QString::fromUtf8(""));
2103  verticalLayout2 = new QVBoxLayout(widgetMain);
2104  verticalLayout2->setSpacing(5);
2105  verticalLayout2->setObjectName(QString::fromUtf8("verticalLayout2"));
2106  verticalLayout2->setContentsMargins(5, 5, 5, 5);
2107  frame = new QFrame(widgetMain);
2108  frame->setObjectName(QString::fromUtf8("frame"));
2109  frame->setFrameShape(QFrame::Box);
2110  frame->setFrameShadow(QFrame::Sunken);
2111  verticalLayout3 = new QVBoxLayout(frame);
2112  verticalLayout3->setObjectName(QString::fromUtf8("verticalLayout3"));
2113  labInfo = new QLabel(frame);
2114  labInfo->setObjectName(QString::fromUtf8("labInfo"));
2115  labInfo->setScaledContents(false);
2116  labInfo->setWordWrap(true);
2117 
2118  verticalLayout3->addWidget(labInfo);
2119 
2120  txtValue = new QLineEdit(frame);
2121  txtValue->setObjectName(QString::fromUtf8("txtValue"));
2122 
2123  verticalLayout3->addWidget(txtValue);
2124 
2125  cboxValue = new QComboBox(frame);
2126  cboxValue->setObjectName(QString::fromUtf8("cboxValue"));
2127 
2128  verticalLayout3->addWidget(cboxValue);
2129 
2130  lay = new QHBoxLayout();
2131  lay->setObjectName(QString::fromUtf8("lay"));
2132  horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding,
2134 
2135  lay->addItem(horizontalSpacer);
2136 
2137  btnOk = new QPushButton(frame);
2138  btnOk->setObjectName(QString::fromUtf8("btnOk"));
2139  btnOk->setMinimumSize(QSize(80, 0));
2140  btnOk->setStyleSheet(QString::fromUtf8(""));
2141  QIcon icon;
2142  icon.addFile(QString::fromUtf8(":/image/btn_ok.png"), QSize(),
2143  QIcon::Normal, QIcon::Off);
2144  btnOk->setIcon(icon);
2145 
2146  lay->addWidget(btnOk);
2147 
2148  btnCancel = new QPushButton(frame);
2149  btnCancel->setObjectName(QString::fromUtf8("btnCancel"));
2150  btnCancel->setMinimumSize(QSize(80, 0));
2151  btnCancel->setStyleSheet(QString::fromUtf8(""));
2152  QIcon icon1;
2153  icon1.addFile(QString::fromUtf8(":/image/btn_close.png"), QSize(),
2154  QIcon::Normal, QIcon::Off);
2155  btnCancel->setIcon(icon1);
2156 
2157  lay->addWidget(btnCancel);
2158  verticalLayout3->addLayout(lay);
2159  verticalLayout2->addWidget(frame);
2160  verticalLayout1->addWidget(widgetMain);
2161 
2162  setTabOrder(txtValue, btnOk);
2163  setTabOrder(btnOk, btnCancel);
2164 
2165  this->labTitle->setText(QStringLiteral("Input Box"));
2166  this->btnOk->setText(QStringLiteral("OK"));
2167  this->btnCancel->setText(QStringLiteral("Cancel"));
2168 
2169  connect(this->btnOk, SIGNAL(clicked()), this, SLOT(on_btnOk_clicked()));
2170  connect(this->btnMenu_Close, SIGNAL(clicked(bool)), this,
2171  SLOT(on_btnMenu_Close_clicked()));
2172  connect(this->btnCancel, SIGNAL(clicked()), this,
2173  SLOT(on_btnMenu_Close_clicked()));
2174 }
2175 
2176 void QUIInputBox::initForm() {
2178  QUIConfig::FontSize + 2);
2181 
2182  this->setProperty("form", true);
2183  this->widgetTitle->setProperty("form", "title");
2184  this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint |
2185  Qt::WindowMinMaxButtonsHint |
2186  Qt::WindowStaysOnTopHint);
2187  this->setFixedSize(280, 150);
2188  this->setWindowTitle(this->labTitle->text());
2189 
2190  int width = 80;
2191  int iconWidth = 18;
2192  int iconHeight = 18;
2193 
2194  QList<QPushButton *> btns = this->frame->findChildren<QPushButton *>();
2195 
2196  foreach (QPushButton *btn, btns) {
2197  btn->setMinimumWidth(width);
2198  btn->setIconSize(QSize(iconWidth, iconHeight));
2199  }
2200 
2201  closeSec = 0;
2202  currentSec = 0;
2203 
2204  QTimer *timer = new QTimer(this);
2205  timer->setInterval(1000);
2206  connect(timer, SIGNAL(timeout()), this, SLOT(checkSec()));
2207  timer->start();
2208 
2209  this->installEventFilter(this);
2210 }
2211 
2212 void QUIInputBox::checkSec() {
2213  if (closeSec == 0) {
2214  return;
2215  }
2216 
2217  if (currentSec < closeSec) {
2218  currentSec++;
2219  } else {
2220  this->close();
2221  }
2222 
2223  QString str = QString("关闭倒计时 %1 s").arg(closeSec - currentSec + 1);
2224  this->labTime->setText(str);
2225 }
2226 
2227 void QUIInputBox::setParameter(const QString &title,
2228  int type,
2229  int closeSec,
2230  QString defaultValue,
2231  bool pwd) {
2232  this->closeSec = closeSec;
2233  this->currentSec = 0;
2234  this->labTime->clear();
2235  this->labInfo->setText(title);
2236 
2237  checkSec();
2238 
2239  if (type == 0) {
2240  this->cboxValue->setVisible(false);
2241  this->txtValue->setPlaceholderText(defaultValue);
2242 
2243  if (pwd) {
2244  this->txtValue->setEchoMode(QLineEdit::Password);
2245  }
2246  } else if (type == 1) {
2247  this->txtValue->setVisible(false);
2248  this->cboxValue->addItems(defaultValue.split("|"));
2249  }
2250 }
2251 
2252 QString QUIInputBox::getValue() const { return this->value; }
2253 
2254 void QUIInputBox::closeEvent(QCloseEvent *) {
2255  closeSec = 0;
2256  currentSec = 0;
2257 }
2258 
2259 bool QUIInputBox::eventFilter(QObject *obj, QEvent *evt) {
2260  static QPoint mousePoint;
2261  static bool mousePressed = false;
2262 
2263  QMouseEvent *event = static_cast<QMouseEvent *>(evt);
2264  if (event->type() == QEvent::MouseButtonPress) {
2265  if (event->button() == Qt::LeftButton) {
2266  mousePressed = true;
2267  mousePoint = event->globalPos() - this->pos();
2268  return true;
2269  }
2270  } else if (event->type() == QEvent::MouseButtonRelease) {
2271  mousePressed = false;
2272  return true;
2273  } else if (event->type() == QEvent::MouseMove) {
2274  if (mousePressed && (event->buttons() && Qt::LeftButton)) {
2275  this->move(event->globalPos() - mousePoint);
2276  return true;
2277  }
2278  }
2279 
2280  return QWidget::eventFilter(obj, evt);
2281 }
2282 
2283 void QUIInputBox::on_btnOk_clicked() {
2284  if (this->txtValue->isVisible()) {
2285  value = this->txtValue->text();
2286  } else if (this->cboxValue->isVisible()) {
2287  value = this->cboxValue->currentText();
2288  }
2289 
2290  done(QMessageBox::Ok);
2291  close();
2292 }
2293 
2294 void QUIInputBox::on_btnMenu_Close_clicked() {
2295  done(QMessageBox::Cancel);
2296  close();
2297 }
2298 
2299 void QUIInputBox::setIconMain(QChar str, quint32 size) {
2300  IconHelper::Instance()->setIcon(this->labIco, str, size);
2301 }
2302 
2303 IconHelper *IconHelper::self = 0;
2304 IconHelper::IconHelper(QObject *) : QObject(qApp) {
2305  int fontId = QFontDatabase::addApplicationFont(
2306  ":/fonts/fontawesome-webfont.ttf");
2307  QStringList fontName = QFontDatabase::applicationFontFamilies(fontId);
2308 
2309  if (fontName.count() > 0) {
2310  iconFont = QFont(fontName.at(0));
2311  } else {
2312  qDebug() << "load fontawesome-webfont.ttf error";
2313  }
2314 }
2315 
2316 void IconHelper::setIcon(QLabel *lab, QChar c, quint32 size) {
2317  iconFont.setPointSize(size);
2318  lab->setFont(iconFont);
2319  lab->setText(c);
2320 }
2321 
2322 void IconHelper::setIcon(QAbstractButton *btn, QChar c, quint32 size) {
2323  iconFont.setPointSize(size);
2324  btn->setFont(iconFont);
2325  btn->setText(c);
2326 }
2327 
2328 QPixmap IconHelper::getPixmap(const QString &color,
2329  QChar c,
2330  quint32 size,
2331  quint32 pixWidth,
2332  quint32 pixHeight) {
2333  QPixmap pix(pixWidth, pixHeight);
2334  pix.fill(Qt::transparent);
2335 
2336  QPainter painter;
2337  painter.begin(&pix);
2338  painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
2339  painter.setPen(QColor(color));
2340  painter.setBrush(QColor(color));
2341 
2342  iconFont.setPointSize(size);
2343  painter.setFont(iconFont);
2344  painter.drawText(pix.rect(), Qt::AlignCenter, c);
2345  painter.end();
2346 
2347  return pix;
2348 }
2349 
2350 QPixmap IconHelper::getPixmap(QToolButton *btn, bool normal) {
2351  QPixmap pix;
2352  int index = btns.indexOf(btn);
2353 
2354  if (index >= 0) {
2355  if (normal) {
2356  pix = pixNormal.at(index);
2357  } else {
2358  pix = pixDark.at(index);
2359  }
2360  }
2361 
2362  return pix;
2363 }
2364 
2365 void IconHelper::setStyle(QWidget *widget,
2366  const QString &type,
2367  int borderWidth,
2368  const QString &borderColor,
2369  const QString &normalBgColor,
2370  const QString &darkBgColor,
2371  const QString &normalTextColor,
2372  const QString &darkTextColor) {
2373  QString strBorder;
2374  if (type == "top") {
2375  strBorder = QString("border-width:%1px 0px 0px 0px;padding:%1px %2px "
2376  "%2px %2px;")
2377  .arg(borderWidth)
2378  .arg(borderWidth * 2);
2379  } else if (type == "right") {
2380  strBorder = QString("border-width:0px %1px 0px 0px;padding:%2px %1px "
2381  "%2px %2px;")
2382  .arg(borderWidth)
2383  .arg(borderWidth * 2);
2384  } else if (type == "bottom") {
2385  strBorder = QString("border-width:0px 0px %1px 0px;padding:%2px %2px "
2386  "%1px %2px;")
2387  .arg(borderWidth)
2388  .arg(borderWidth * 2);
2389  } else if (type == "left") {
2390  strBorder = QString("border-width:0px 0px 0px %1px;padding:%2px %2px "
2391  "%2px %1px;")
2392  .arg(borderWidth)
2393  .arg(borderWidth * 2);
2394  }
2395 
2396  QStringList qss;
2397  qss.append(QString("QWidget[flag=\"%1\"] "
2398  "QAbstractButton{border-style:none;border-radius:0px;"
2399  "padding:5px;color:%2;background:%3;}")
2400  .arg(type)
2401  .arg(normalTextColor)
2402  .arg(normalBgColor));
2403 
2404  qss.append(QString("QWidget[flag=\"%1\"] QAbstractButton:hover,"
2405  "QWidget[flag=\"%1\"] QAbstractButton:pressed,"
2406  "QWidget[flag=\"%1\"] QAbstractButton:checked{"
2407  "border-style:solid;%2border-color:%3;color:%4;"
2408  "background:%5;}")
2409  .arg(type)
2410  .arg(strBorder)
2411  .arg(borderColor)
2412  .arg(darkTextColor)
2413  .arg(darkBgColor));
2414 
2415  widget->setStyleSheet(qss.join(""));
2416 }
2417 
2418 void IconHelper::setStyle(QWidget *widget,
2419  QList<QToolButton *> btns,
2420  QList<int> pixChar,
2421  quint32 iconSize,
2422  quint32 iconWidth,
2423  quint32 iconHeight,
2424  const QString &type,
2425  int borderWidth,
2426  const QString &borderColor,
2427  const QString &normalBgColor,
2428  const QString &darkBgColor,
2429  const QString &normalTextColor,
2430  const QString &darkTextColor) {
2431  int btnCount = btns.count();
2432  int charCount = pixChar.count();
2433  if (btnCount <= 0 || charCount <= 0 || btnCount != charCount) {
2434  return;
2435  }
2436 
2437  QString strBorder;
2438  if (type == "top") {
2439  strBorder = QString("border-width:%1px 0px 0px 0px;padding:%1px %2px "
2440  "%2px %2px;")
2441  .arg(borderWidth)
2442  .arg(borderWidth * 2);
2443  } else if (type == "right") {
2444  strBorder = QString("border-width:0px %1px 0px 0px;padding:%2px %1px "
2445  "%2px %2px;")
2446  .arg(borderWidth)
2447  .arg(borderWidth * 2);
2448  } else if (type == "bottom") {
2449  strBorder = QString("border-width:0px 0px %1px 0px;padding:%2px %2px "
2450  "%1px %2px;")
2451  .arg(borderWidth)
2452  .arg(borderWidth * 2);
2453  } else if (type == "left") {
2454  strBorder = QString("border-width:0px 0px 0px %1px;padding:%2px %2px "
2455  "%2px %1px;")
2456  .arg(borderWidth)
2457  .arg(borderWidth * 2);
2458  }
2459 
2460  QStringList qss;
2461  qss.append(QString("QWidget[flag=\"%1\"] "
2462  "QAbstractButton{border-style:none;border-radius:0px;"
2463  "padding:5px;color:%2;background:%3;}")
2464  .arg(type)
2465  .arg(normalTextColor)
2466  .arg(normalBgColor));
2467 
2468  qss.append(QString("QWidget[flag=\"%1\"] QAbstractButton:hover,"
2469  "QWidget[flag=\"%1\"] QAbstractButton:pressed,"
2470  "QWidget[flag=\"%1\"] QAbstractButton:checked{"
2471  "border-style:solid;%2border-color:%3;color:%4;"
2472  "background:%5;}")
2473  .arg(type)
2474  .arg(strBorder)
2475  .arg(borderColor)
2476  .arg(darkTextColor)
2477  .arg(darkBgColor));
2478 
2479  qss.append(QString("QWidget#%1{background:%2;}")
2480  .arg(widget->objectName())
2481  .arg(normalBgColor));
2482 
2483  qss.append(QString("QToolButton{border-width:0px;}"));
2484  qss.append(QString("QToolButton{background-color:%1;color:%2;}")
2485  .arg(normalBgColor)
2486  .arg(normalTextColor));
2487  qss.append(QString("QToolButton:hover,QToolButton:pressed,QToolButton:"
2488  "checked{background-color:%1;color:%2;}")
2489  .arg(darkBgColor)
2490  .arg(darkTextColor));
2491 
2492  widget->setStyleSheet(qss.join(""));
2493 
2494  for (int i = 0; i < btnCount; i++) {
2495  // Store corresponding button object for easy image switching on mouse
2496  // hover
2497  QPixmap pixNormal = getPixmap(normalTextColor, QChar(pixChar.at(i)),
2498  iconSize, iconWidth, iconHeight);
2499  QPixmap pixDark = getPixmap(darkTextColor, QChar(pixChar.at(i)),
2500  iconSize, iconWidth, iconHeight);
2501 
2502  btns.at(i)->setIcon(QIcon(pixNormal));
2503  btns.at(i)->setIconSize(QSize(iconWidth, iconHeight));
2504  btns.at(i)->installEventFilter(this);
2505 
2506  this->btns.append(btns.at(i));
2507  this->pixNormal.append(pixNormal);
2508  this->pixDark.append(pixDark);
2509  }
2510 }
2511 
2513  QList<QToolButton *> btns,
2514  QList<int> pixChar,
2515  quint32 iconSize,
2516  quint32 iconWidth,
2517  quint32 iconHeight,
2518  const QString &normalBgColor,
2519  const QString &darkBgColor,
2520  const QString &normalTextColor,
2521  const QString &darkTextColor) {
2522  int btnCount = btns.count();
2523  int charCount = pixChar.count();
2524  if (btnCount <= 0 || charCount <= 0 || btnCount != charCount) {
2525  return;
2526  }
2527 
2528  QStringList qss;
2529  qss.append(QString("QToolButton{border-width:0px;}"));
2530  qss.append(QString("QToolButton{background-color:%1;color:%2;}")
2531  .arg(normalBgColor)
2532  .arg(normalTextColor));
2533  qss.append(QString("QToolButton:hover,QToolButton:pressed,QToolButton:"
2534  "checked{background-color:%1;color:%2;}")
2535  .arg(darkBgColor)
2536  .arg(darkTextColor));
2537 
2538  frame->setStyleSheet(qss.join(""));
2539 
2540  for (int i = 0; i < btnCount; i++) {
2541  // Store corresponding button object for easy image switching on mouse
2542  // hover
2543  QPixmap pixNormal = getPixmap(normalTextColor, QChar(pixChar.at(i)),
2544  iconSize, iconWidth, iconHeight);
2545  QPixmap pixDark = getPixmap(darkTextColor, QChar(pixChar.at(i)),
2546  iconSize, iconWidth, iconHeight);
2547 
2548  btns.at(i)->setIcon(QIcon(pixNormal));
2549  btns.at(i)->setIconSize(QSize(iconWidth, iconHeight));
2550  btns.at(i)->installEventFilter(this);
2551 
2552  this->btns.append(btns.at(i));
2553  this->pixNormal.append(pixNormal);
2554  this->pixDark.append(pixDark);
2555  }
2556 }
2557 
2558 bool IconHelper::eventFilter(QObject *watched, QEvent *event) {
2559  if (watched->inherits("QToolButton")) {
2560  QToolButton *btn = (QToolButton *)watched;
2561  int index = btns.indexOf(btn);
2562  if (index >= 0) {
2563  if (event->type() == QEvent::Enter) {
2564  btn->setIcon(QIcon(pixDark.at(index)));
2565  } else if (event->type() == QEvent::Leave) {
2566  if (btn->isChecked()) {
2567  btn->setIcon(QIcon(pixDark.at(index)));
2568  } else {
2569  btn->setIcon(QIcon(pixNormal.at(index)));
2570  }
2571  }
2572  }
2573  }
2574 
2575  return QObject::eventFilter(watched, event);
2576 }
2577 
2578 QChar QUIConfig::IconMain = QChar(0xf072);
2579 QChar QUIConfig::IconMenu = QChar(0xf0d7);
2580 QChar QUIConfig::IconMin = QChar(0xf068);
2581 QChar QUIConfig::IconMax = QChar(0xf2d2);
2582 QChar QUIConfig::IconNormal = QChar(0xf2d0);
2583 QChar QUIConfig::IconClose = QChar(0xf00d);
2584 
2585 #ifdef __arm__
2586 QString QUIConfig::FontName = "Droid Sans Fallback";
2587 int QUIConfig::FontSize = 13;
2588 #else
2589 QString QUIConfig::FontName = "Microsoft Yahei";
2590 int QUIConfig::FontSize = 9;
2591 #endif
2592 
2593 QString QUIConfig::ConfigFile = "config.ini";
2594 QString QUIConfig::TextColor = "#F0F0F0";
2595 QString QUIConfig::PanelColor = "#F0F0F0";
2596 QString QUIConfig::BorderColor = "#F0F0F0";
2597 QString QUIConfig::NormalColorStart = "#F0F0F0";
2598 QString QUIConfig::NormalColorEnd = "#F0F0F0";
2599 QString QUIConfig::DarkColorStart = "#F0F0F0";
2600 QString QUIConfig::DarkColorEnd = "#F0F0F0";
2601 QString QUIConfig::HighColor = "#F0F0F0";
2602 
2604  if (!CheckConfig()) {
2605  return;
2606  }
2607 
2608  QSettings set(QUIConfig::ConfigFile, QSettings::IniFormat);
2609 
2610  set.beginGroup("BaseConfig");
2611  set.endGroup();
2612 }
2613 
2615  QSettings set(QUIConfig::ConfigFile, QSettings::IniFormat);
2616 
2617  set.beginGroup("BaseConfig");
2618  set.endGroup();
2619 }
2620 
2622 #if (QT_VERSION <= QT_VERSION_CHECK(5, 0, 0))
2623 #endif
2624  WriteConfig();
2625 }
2626 
2628  // If config file size is 0, continue with initial values and generate
2629  // config file
2630  QFile file(QUIConfig::ConfigFile);
2631 
2632  if (file.size() == 0) {
2633  NewConfig();
2634  return false;
2635  }
2636 
2637  // If config file is incomplete, continue with initial values and generate
2638  // config file
2639  if (file.open(QFile::ReadOnly)) {
2640  bool ok = true;
2641 
2642  while (!file.atEnd()) {
2643  QString line = file.readLine();
2644  line = line.replace("\r", "");
2645  line = line.replace("\n", "");
2646  QStringList list = line.split("=");
2647 
2648  if (list.count() == 2) {
2649  if (list.at(1) == "") {
2650  ok = false;
2651  break;
2652  }
2653  }
2654  }
2655 
2656  if (!ok) {
2657  NewConfig();
2658  return false;
2659  }
2660  } else {
2661  NewConfig();
2662  return false;
2663  }
2664 
2665  return true;
2666 }
Rect frame
MouseEvent event
double normal[3]
int width
int size
std::string name
int height
char type
math::float4 color
QRegularExpression QtCompatRegExp
Definition: QtCompat.h:170
core::Tensor result
Definition: VtkUtils.cpp:76
bool copy
Definition: VtkUtils.cpp:74
IconHelper(QObject *parent=0)
void setIcon(QLabel *lab, QChar c, quint32 size=9)
static IconHelper * Instance()
Definition: ecvUIManager.h:552
bool eventFilter(QObject *watched, QEvent *event)
QPixmap getPixmap(const QString &color, QChar c, quint32 size=9, quint32 pixWidth=10, quint32 pixHeight=10)
static void setStyle(QWidget *widget, const QString &type="left", int borderWidth=3, const QString &borderColor="#029FEA", const QString &normalBgColor="#292F38", const QString &darkBgColor="#1D2025", const QString &normalTextColor="#54626F", const QString &darkTextColor="#FDFDFD")
void cancelPreviousPickingOperation(bool aborted)
ccDBRoot * db()
Returns real 'dbRoot' object.
Definition: MainWindow.h:193
void updateOverlayDialogsPlacement() override
Forces the update of all registered MDI 'overlay' dialogs.
static bool s_autoSaveGuiElementPos
Definition: MainWindow.h:207
void updateFullScreenMenu(bool state)
bool m_FirstShow
Flag: first time the window is made visible.
Definition: MainWindow.h:206
void saveGUIElementsPos()
Saves position and state of all GUI elements.
static QTextCodec * codecForName(const char *name)
Definition: quazip.h:50
static void WriteConfig()
static void ReadConfig()
static QChar IconClose
Definition: ecvUIManager.h:634
static QChar IconNormal
Definition: ecvUIManager.h:633
static QString BorderColor
Definition: ecvUIManager.h:643
static void NewConfig()
static QString FontName
Definition: ecvUIManager.h:636
static QString DarkColorEnd
Definition: ecvUIManager.h:647
static QString NormalColorStart
Definition: ecvUIManager.h:644
static QString HighColor
Definition: ecvUIManager.h:648
static QChar IconMin
Definition: ecvUIManager.h:631
static QChar IconMenu
Definition: ecvUIManager.h:630
static int FontSize
Definition: ecvUIManager.h:637
static QString TextColor
Definition: ecvUIManager.h:641
static QChar IconMain
Definition: ecvUIManager.h:629
static QString ConfigFile
Definition: ecvUIManager.h:638
static QString PanelColor
Definition: ecvUIManager.h:642
static QChar IconMax
Definition: ecvUIManager.h:632
static bool CheckConfig()
static QString NormalColorEnd
Definition: ecvUIManager.h:645
static QString DarkColorStart
Definition: ecvUIManager.h:646
void setParameter(const QString &title, int type=0, int closeSec=0, QString defaultValue=QString(), bool pwd=false)
bool eventFilter(QObject *obj, QEvent *evt)
void closeEvent(QCloseEvent *)
static QUIInputBox * Instance()
Definition: ecvUIManager.h:478
QUIInputBox(QWidget *parent=0)
void setIconMain(QChar str, quint32 size=9)
QString getValue() const
void setMessage(const QString &msg, int type, int closeSec=0)
static QUIMessageBox * Instance()
Definition: ecvUIManager.h:409
bool eventFilter(QObject *obj, QEvent *evt)
QUIMessageBox(QWidget *parent=0)
void setIconMain(QChar str, quint32 size=9)
void closeEvent(QCloseEvent *)
QPushButton * getBtnMenuMin() const
static QString decimalToStrBin1(int decimal)
static int deskWidth()
static void setFormInCenter(QWidget *frm)
void setMinHide(bool minHide)
static bool isTel(const QString &tel)
static QString getFolderName()
void setMainWidget(MainWindow *mainWidget)
static QString decimalToStrBin2(int decimal)
static QByteArray hexStrToByteArray(const QString &str)
static QString appName()
static void runWithSystem(const QString &strName, const QString &strPath, bool autoRun=true)
static uchar getOrCode(const QByteArray &data)
static void setStyle(QUIWidget::Style style)
void setWindowLogo(const QString &icon)
static char convertHexChar(char ch)
void setPixmap(QUIWidget::Widget widget, const QString &file, const QSize &size=QSize(32, 32))
static QString byteArrayToAsciiStr(const QByteArray &data)
static QByteArray ushortToByte(ushort i)
static QString getFileName(const QString &filter, QString defaultDir=QCoreApplication::applicationDirPath())
QLabel * getLabIco() const
static void setCode()
static QString decimalToStrHex(int decimal)
static int strHexToDecimal(const QString &strHex)
static QByteArray asciiStrToByteArray(const QString &str)
static void sleep(int sec)
void setOnlyCloseBtn()
static QByteArray intToByte(int i)
static bool copyFile(const QString &sourceFile, const QString &targetFile)
void toggleFullScreen(bool state)
toggles full screen
static uchar getCheckCode(const QByteArray &data)
void createTrayMenu()
static QString byteArrayToHexStr(const QByteArray &data)
static QString getXorEncryptDecrypt(const QString &str, char key)
static void showMessageBoxInfo(const QString &info, int closeSec=0)
static void getQssColor(const QString &qss, QString &textColor, QString &panelColor, QString &borderColor, QString &normalColorStart, QString &normalColorEnd, QString &darkColorStart, QString &darkColorEnd, QString &highColor)
static int byteToUShort(const QByteArray &data)
static QString strHexToStrBin(const QString &strHex)
static bool isEmail(const QString &email)
static bool fileIsExist(const QString &strFile)
void setVisible(QUIWidget::Widget widget, bool visible=true)
@ Style_LightBlue
Definition: ecvUIManager.h:72
@ Style_LightGray
Definition: ecvUIManager.h:75
@ Style_DarkGray
Definition: ecvUIManager.h:76
@ Style_FlatBlack
Definition: ecvUIManager.h:81
@ Style_FlatWhite
Definition: ecvUIManager.h:82
@ Style_LightBlack
Definition: ecvUIManager.h:78
@ Style_DarkBlack
Definition: ecvUIManager.h:79
@ Style_DarkBlue
Definition: ecvUIManager.h:73
QString title
Definition: ecvUIManager.h:54
static QString appPath()
void setIcon(QUIWidget::Widget widget, QChar str, quint32 size=9)
static void setTranslator(const QString &qmFile=":/image/qt_zh_CN.qm")
QUIWidget(QWidget *parent=0)
void setIconMain(QChar str, quint32 size=9)
static void setSystemDateTime(const QString &year, const QString &month, const QString &day, const QString &hour, const QString &min, const QString &sec)
static void showMessageBoxError(const QString &info, int closeSec=0)
static int strBinToDecimal(const QString &strBin)
QString getTitle() const
QPushButton * getBtnMenuMax() const
static QString getFileNameWithExtension(const QString &strFilePath)
static int byteToInt(const QByteArray &data)
static bool isIP(const QString &ip)
Qt::Alignment alignment
Definition: ecvUIManager.h:55
void setBtnWidth(int width)
static void deleteDirectory(const QString &path)
QPushButton * getBtnMenuMClose() const
static QString showInputBox(bool &ok, const QString &title, int type=0, int closeSec=0, QString defaultValue=QString(), bool pwd=false)
void setTitle(const QString &title)
void closing()
static bool isMac(const QString &mac)
QSize minimumSizeHint() const
QLabel * getLabTitle() const
Qt::Alignment getAlignment() const
static int showMessageBoxQuestion(const QString &info)
static int strDecimalToDecimal(const QString &strDecimal)
static bool folderIsExist(const QString &strFolder)
QToolButton * getBtnMenu() const
static int deskHeight()
QSize sizeHint() const
static void newDir(const QString &dirName)
static void writeInfo(const QString &info, const QString &filePath="log")
void setAlignment(Qt::Alignment alignment)
static QStringList getFileNames(const QString &filter, QString defaultDir=QCoreApplication::applicationDirPath())
@ BtnMenu_Normal
Definition: ecvUIManager.h:64
static QStringList getFolderFileNames(const QStringList &filter)
void setTitleHeight(int height)
ccHObject * getRootEntity()
Returns associated root object.
Definition: ecvDBRoot.cpp:421
unsigned getChildrenNumber() const
Returns the number of children.
Definition: ecvHObject.h:312
static const QString CurrentTheme()
static const QString MainWinState()
static const QString MainWinGeom()
static const QString MainWindowSettings()
static const QString ThemeSettings()
static QVariant getValue(const QString &section, const QString &key, const QVariant &defaultValue=QVariant())
static void setValue(const QString &section, const QString &key, const QVariant &value)
unsigned short ushort
Definition: cutil_math.h:29
int min(int a, int b)
Definition: cutil_math.h:53
#define DATETIME
Definition: ecvHead.h:24
#define NEWLINE
Definition: ecvUIManager.h:13
static const QString TITLE
static const QString APP_LOGO
Tensor Append(const Tensor &self, const Tensor &other, const utility::optional< int64_t > &axis)
Appends the two tensors, along the given axis into a new tensor. Both the tensors must have same data...
Tensor Minimum(const Tensor &input, const Tensor &other)
Computes the element-wise minimum of input and other. The tensors must have same data type and device...
void Resize(const core::Tensor &src_im, core::Tensor &dst_im, Image::InterpType interp_type)
Definition: IPPImage.cpp:94
static const std::string path
Definition: PointCloud.cpp:59
unsigned char uchar
Definition: matrix.h:41
struct Trigger Trigger
Definition: sqlite3.c:14669
double timer
Definition: struct.h:215