mainwindow.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "jobs.h"
  4. #include <QDebug>
  5. #include <QWidget>
  6. #include <QPushButton>
  7. #include "logger.h"
  8. #include "loadingWidget.h"
  9. // 定义 ANzI 转义序列来设置颜色
  10. #define ANSI_COLOR_GREEN "\x1B[32m"
  11. #define ANSI_COLOR_RESET "\x1B[0m"
  12. MainWindow::MainWindow(QWidget *parent)
  13. : QMainWindow(parent)
  14. , ui(new Ui::MainWindow)
  15. {
  16. // 去除窗口边界,设置为无边框窗口
  17. this->setWindowFlags(Qt::FramelessWindowHint);
  18. this->setWindowState(Qt::WindowMaximized); //Maximizes the window
  19. ui->setupUi(this);
  20. initializeAnimate();
  21. initialMqttService();
  22. pageFactories[ui->btnNew] = new AddressFactory();
  23. pageFactories[ui->btnBlastProject] = new BlastProjectFactory();
  24. pageFactories[ui->btnEquipment] = new EquipmentFactory();
  25. pageFactories[ui->btnDet] = new DetInfoFactory();
  26. pageFactories[ui->btnBlastOper] = new BlastOperationFactory();
  27. pageFactories[ui->btnRecord] = new BlastRecordFactory();
  28. connect(ui->btnToggle, &QPushButton::clicked, this, &MainWindow::onToggleButtonClicked);
  29. for (auto *widget : left_button_station) {
  30. QPushButton *button = qobject_cast<QPushButton*>(widget);
  31. if (button) {
  32. connect(button, &QPushButton::clicked, this, [this, button]{
  33. onButtonClicked(button);
  34. });
  35. }
  36. }
  37. initDateTime();
  38. initialBtnSerial();
  39. // initialGPSSerial();
  40. ui->labLat->setText("经度: "+lat);
  41. ui->labLon->setText("维度: "+lon);
  42. connect(ui->btnClose, &QPushButton::clicked, this, &MainWindow::close);
  43. connect(this, &MainWindow::projectTitleChanged, this, &MainWindow::updateProjectTitleLabel);
  44. }
  45. void MainWindow::updateProjectTitleLabel(const QString &newTitle) {
  46. ui->projectTitleLable->setText(newTitle);
  47. }
  48. void MainWindow::setProjectTitle(const QString &newTitle) {
  49. if (m_currentProjectTitle != newTitle) {
  50. m_currentProjectTitle = newTitle;
  51. // Emit the signal to notify listeners (like our QLabel slot)
  52. emit projectTitleChanged(m_currentProjectTitle);
  53. }
  54. }
  55. void MainWindow::initializeAnimate() {
  56. move(200, 200);
  57. animate_leftFrame = new QPropertyAnimation(ui->leftFrame, "minimumWidth");
  58. animate_leftFrame->setDuration(300);
  59. for (QObject *child : ui->left_buttonsBox->children()) {
  60. if (qobject_cast<QWidget*>(child)) {
  61. left_button_station.append(qobject_cast<QWidget*>(child));
  62. }
  63. }
  64. }
  65. void MainWindow::onToggleButtonClicked() {
  66. // 执行动画
  67. JOBS ::btn_animation(ui->leftFrame, animate_leftFrame);
  68. for (QWidget *b : left_button_station) {
  69. b->setProperty("spread", !b->property("spread").toBool());
  70. b->setStyleSheet(b->styleSheet());
  71. }
  72. }
  73. // 选中按钮
  74. void MainWindow::onButtonClicked(QPushButton *button)
  75. {
  76. setStyleSheets(static_cast<QPushButton *>(button));
  77. switchPage(static_cast<QPushButton *>(button));
  78. }
  79. void MainWindow::switchPage(QWidget *button) {
  80. if (pageFactories.contains(button)) {
  81. PageFactory* factory = pageFactories[button];
  82. if (createdPageByButton.contains(button)) {
  83. QWidget* existingPage = createdPageByButton[button];
  84. existingPage->hide();
  85. ui->stackedWidget->removeWidget(existingPage);
  86. createdPageByButton.remove(button);
  87. }
  88. QWidget* newPage = factory->createPage(this);
  89. ui->stackedWidget->addWidget(newPage);
  90. ui->stackedWidget->setCurrentWidget(newPage);
  91. setProjectTitle(qobject_cast<QPushButton*>(button)->text());
  92. createdPageByButton.insert(button, newPage);
  93. int pageCount = ui->stackedWidget->count();
  94. }
  95. }
  96. void MainWindow::initialMqttService()
  97. {
  98. Logger::getInstance().info("Start init Mqtt server.");
  99. MqttClient *pcMqttInit = MqttClient::getInstance();
  100. QStringList topics = {"hxgc/topic","hxgc/companycode/pro/P"};
  101. pcMqttInit->connectToMqttBroker("114.55.233.194", 1883, "hxgc", "hxgc123456", "pcMqttInitY11", topics);
  102. connect(pcMqttInit, &MqttClient::proMessageReceived, this, &MainWindow::messageAndTopicReceived);
  103. Logger::getInstance().info("Connect Mqtt server request sent.");
  104. }
  105. void MainWindow::messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic){
  106. QJsonDocument jsonDoc = QJsonDocument::fromJson(message);
  107. if (!jsonDoc.isNull() && jsonDoc.isObject()) {
  108. QJsonObject jsonObj = jsonDoc.object();
  109. if (jsonObj.contains("uuid")&& jsonObj.contains("status")) {
  110. QJsonValue uuidValue = jsonObj["uuid"];
  111. QJsonValue statusValue = jsonObj["status"];
  112. if (statusValue.isString() && statusValue.toString() == "1") { // "1" 未注册
  113. if (uuidValue.isNull()) {
  114. qDebug() << "uuid 的值为 null";
  115. } else {
  116. QString uuid = uuidValue.toString();
  117. HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
  118. dao.updateBlastStatusByUuid(uuid,"2");
  119. }
  120. }
  121. }
  122. }
  123. }
  124. void MainWindow::setStyleSheets(QPushButton *selectedButton)
  125. {
  126. for (auto *b : left_button_station) {
  127. b->setProperty("selected", b == selectedButton);
  128. b->setStyleSheet(b->styleSheet()); // 刷新显示
  129. }
  130. }
  131. // 处理 MQTT 连接成功的槽函数
  132. void MainWindow::onMqttConnected()
  133. {
  134. m_isMqttConnected = true;
  135. Logger::getInstance().info("Mqtt connected.");
  136. }
  137. void MainWindow::initialBtnSerial()
  138. { bool success;
  139. serialTool = SerialTool::getInstance(this,&success);
  140. connect(serialTool, &SerialTool::serialPortOpened, this, &MainWindow::onSerialToolCreated);
  141. serialTool->setupSerialPort();
  142. Logger::getInstance().info("Fire buttons initialized");
  143. }
  144. void MainWindow::onSerialToolCreated()
  145. {
  146. m_btnSerialInitialized = true;
  147. serialTool->releaseInstance();
  148. qDebug() << ANSI_COLOR_GREEN << "Serial tool initialized" << ANSI_COLOR_RESET;
  149. Logger::getInstance().info("SerialTool initialized");
  150. }
  151. void MainWindow::initialGPSSerial(){
  152. Logger::getInstance().info("开始初始化GPS");
  153. SerialGPSThread* threadGPS = new SerialGPSThread(this);
  154. connect(threadGPS, &SerialGPSThread::storedGNRMCDataUpdated, this,&MainWindow::handleStoredGNRMCData);
  155. threadGPS->start();
  156. }
  157. // 槽函数,用于接收 RMCData 数据
  158. void MainWindow::handleStoredGNRMCData(const RMCData &data)
  159. {
  160. if(data.isValid){
  161. lat = QString::number(data.latitude);
  162. lon = QString::number(data.longitude);
  163. }else{
  164. lat = "定位失败";
  165. lon = "定位失败";
  166. }
  167. ui->labLat->setText("经度: "+lat);
  168. ui->labLon->setText("纬度: "+lon);
  169. labLat = lat;
  170. labLon = lon;
  171. }
  172. void MainWindow::initDateTime(){
  173. timeThread = new TimeUpdateThread(this);
  174. connect(timeThread, &TimeUpdateThread::timeUpdated, this, &MainWindow::onTimeUpdated);
  175. timeThread->start();
  176. }
  177. void MainWindow::onTimeUpdated(const QString &timeString)
  178. {
  179. ui->dateTimeShow->setText(timeString);
  180. }
  181. MainWindow::~MainWindow()
  182. {
  183. timeThread->stop();
  184. delete ui;
  185. }
  186. void MainWindow::mousePressEvent(QMouseEvent *event)
  187. {
  188. if (event->button() == Qt::LeftButton) {
  189. m_dragPosition = event->globalPos() - frameGeometry().topLeft();
  190. event->accept();
  191. }
  192. }
  193. void MainWindow::mouseMoveEvent(QMouseEvent *event)
  194. {
  195. if (event->buttons() & Qt::LeftButton) {
  196. move(event->globalPos() - m_dragPosition);
  197. event->accept();
  198. }
  199. }