#include"aircondition.h"\n#include"ui_aircondition.h"\n#include"switchform.h"\n#include"lcdform.h"\n#include"sqlite.h"\n#include<QSqlQuery>\n#include<QSqlError>\n#include<QDoubleSpinBox>\n#include<QTimer>\n#include<QDebug>\n\nAirCondition::AirCondition(int userid, QWidget parent) :\n QWidget(parent),\n ui(new Ui::AirCondition),\n userid(userid),\n m_loadLastStatus(true),\n m_connectionsEstablished(false)\n{\n ui->setupUi(this);\n airConditionWidget();\n m_updateTimer = new QTimer(this);\n m_updateTimer->setInterval(500); // 设置定时器间隔为0.5秒\n connect(m_updateTimer, &QTimer::timeout, this, &AirCondition::updateDatabase);\n // 加载上次更改的状态\n loadLastStatus();\n}\n\nAirCondition::~AirCondition()\n{\n delete ui;\n}\n\nvoid AirCondition::airConditionWidget()\n{\n setWindowTitle("空调设置");\n // 设置ui组件背景\n setAutoFillBackground(true);\n QPalette palette = this->palette();\n QPixmap pixmap(":/user/image/image/aircondition.jpg");\n palette.setBrush(QPalette::Window, QBrush(pixmap));\n setPalette(palette);\n setFixedSize(600, 400);\n}\n\nvoid AirCondition::switchButton_status()\n{\n // 判断是否是用户操作\n if (QObject::sender() == ui->SwitchStatus) {\n // 更新状态到数据库\n if (ui->SwitchStatus->checked()) {\n\n ui->temperature->findChild<QDoubleSpinBox>("doubleSpinBox")->setEnabled(true);\n ui->temperature->setValue(lasttemp.toDouble());\n\n } else {\n lasttemp = getLastTemperature(this->userid);\n ui->temperature->setValue(0);\n ui->temperature->findChild<QDoubleSpinBox*>("doubleSpinBox")->setEnabled(false);\n }\n // 重启定时器\n m_updateTimer->start();\n }\n\n}\n\nvoid AirCondition::temperature_changed()\n{\n // 判断是否是用户操作\n if (QObject::sender() == ui->temperature->findChild<QDoubleSpinBox*>("doubleSpinBox")) {\n // 重启定时器\n m_updateTimer->start();\n }\n}\n\nvoid AirCondition::loadLastStatus()\n{\n if (!m_loadLastStatus) { // 判断是否加载上一次的信息\n return;\n }\n\n QString state = getLastState(this->userid);\n QString temp = getLastTemperature(this->userid);\n\n if (state == "开启") {\n ui->SwitchStatus->setChecked(true);\n ui->temperature->setValue(temp.toDouble());\n } else {\n ui->SwitchStatus->setChecked(false);\n ui->temperature->setValue(0);\n ui->temperature->findChild<QDoubleSpinBox*>("doubleSpinBox")->setEnabled(false);\n }\n\n m_loadLastStatus = false; // 加载完毕后将标志位设置为false,避免重复加载\n if (m_connectionsEstablished) {\n return; // 如果信号槽连接已建立,则直接返回\n }\n\n // 建立信号槽连接\n connect(ui->SwitchStatus, &SwitchForm::statusChanged, this, &AirCondition::switchButton_status);\n connect(ui->temperature->findChild<QDoubleSpinBox*>("doubleSpinBox"), QOverload::of(&QDoubleSpinBox::valueChanged), this, &AirCondition::temperature_changed);\n connect(ui->temperature->findChild<QDoubleSpinBox*>("doubleSpinBox"), QOverload::of(&QDoubleSpinBox::valueChanged), this, &AirCondition::startUpdateTimer);\n\n m_connectionsEstablished = true; // 设置标志位为true,表示信号槽连接已建立\n}\n\nQString AirCondition::getLastTemperature(int userid)\n{\n QString queryStr = QString("SELECT value FROM Status WHERE uid = %1 AND device_name = '空调' ORDER BY sid DESC LIMIT 1").arg(userid);\n QSqlQuery query;\n if (query.exec(queryStr) && query.next()) {\n return query.value(0).toString();\n } else {\n qDebug() << "未得到上一次温度: " << query.lastError().text();\n return "";\n }\n}\n\nvoid AirCondition::updateLastTemperature(int userid, QString temperature)\n{\n QString queryStr = QString("UPDATE Status SET value = '%1' WHERE uid = %2 AND device_name = '空调' AND sid = (SELECT MAX(sid) FROM Status WHERE uid = %2)").arg(temperature).arg(userid);\n QSqlQuery query;\n if (!query.exec(queryStr)) {\n qDebug() << "更新温度失败: " << query.lastError().text();\n }\n}\n\nQString AirCondition::getLastState(int userid)\n{\n QString queryStr = QString("SELECT device_state FROM Status WHERE uid = %1 AND device_name = '空调' ORDER BY sid DESC LIMIT 1").arg(userid);\n QSqlQuery query;\n if (query.exec(queryStr) && query.next()) {\n return query.value(0).toString();\n } else {\n qDebug() << "未得到上一次状态: " << query.lastError().text();\n return "";\n }\n}\n\nvoid AirCondition::startUpdateTimer()\n{\n m_updateTimer->start(); // 启动定时器\n}\n\nvoid AirCondition::updateDatabase()\n{\n // 更新状态到数据库\n QString temp = ui->SwitchStatus->checked() ? QString::number(ui->temperature->getValue()) : "0";\n updateSmartHomeStatus(userid, QString("空调"), ui->SwitchStatus->checked() ? QString("开启") : QString("关闭"), temp);\n\n m_updateTimer->stop(); // 停止定时器\n}\n


原文地址: https://www.cveoy.top/t/topic/qmkM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录