空调设置组件 - Qt 开发指南
#include 'aircondition.h'
#include 'ui_aircondition.h'
#include 'switchform.h'
#include 'lcdform.h'
#include 'sqlite.h'
#include
AirCondition::AirCondition(int userid, QWidget *parent) : QWidget(parent), ui(new Ui::AirCondition), userid(userid), m_loadLastStatus(true), m_connectionsEstablished(false) { ui->setupUi(this); airConditionWidget(); m_updateTimer = new QTimer(this); m_updateTimer->setInterval(500); // 设置定时器间隔为0.5秒 connect(m_updateTimer, &QTimer::timeout, this, &AirCondition::updateDatabase); // 加载上次更改的状态 loadLastStatus(); }
AirCondition::~AirCondition() { delete ui; }
void AirCondition::airConditionWidget() { setWindowTitle('空调设置'); // 设置ui组件背景 setAutoFillBackground(true); QPalette palette = this->palette(); QPixmap pixmap(':/user/image/image/aircondition.jpg'); palette.setBrush(QPalette::Window, QBrush(pixmap)); setPalette(palette); setFixedSize(600, 400); }
void AirCondition::switchButton_status() { // 判断是否是用户操作 if (QObject::sender() == ui->SwitchStatus) { // 更新状态到数据库 if (ui->SwitchStatus->checked()) {
ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')->setEnabled(true);
ui->temperature->setValue(lasttemp.toDouble());
} else {
lasttemp = getLastTemperature(this->userid);
ui->temperature->setValue(0);
ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')->setEnabled(false);
}
// 重启定时器
m_updateTimer->start();
}
}
void AirCondition::temperature_changed() { // 判断是否是用户操作 if (QObject::sender() == ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')) { // 重启定时器 m_updateTimer->start(); } }
void AirCondition::loadLastStatus() { if (!m_loadLastStatus) { // 判断是否加载上一次的信息 return; }
QString state = getLastState(this->userid);
QString temp = getLastTemperature(this->userid);
if (state == '开启') {
ui->SwitchStatus->setChecked(true);
ui->temperature->setValue(temp.toDouble());
} else {
ui->SwitchStatus->setChecked(false);
ui->temperature->setValue(0);
ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')->setEnabled(false);
}
m_loadLastStatus = false; // 加载完毕后将标志位设置为false,避免重复加载
if (m_connectionsEstablished) {
return; // 如果信号槽连接已建立,则直接返回
}
// 建立信号槽连接
connect(ui->SwitchStatus, &SwitchForm::statusChanged, this, &AirCondition::switchButton_status);
connect(ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox'), QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &AirCondition::temperature_changed);
connect(ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox'), QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &AirCondition::startUpdateTimer);
// 如果开启按钮的状态是关闭的,则将温度值设置为0
if (!ui->SwitchStatus->checked()) {
ui->temperature->setValue(0);
}
m_connectionsEstablished = true; // 设置标志位为true,表示信号槽连接已建立
}
QString AirCondition::getLastTemperature(int userid) { QString queryStr = QString('SELECT value FROM Status WHERE uid = %1 AND device_name = '空调' ORDER BY sid DESC LIMIT 1').arg(userid); QSqlQuery query; if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { qDebug() << '未得到上一次温度: ' << query.lastError().text(); return ''; } }
QString AirCondition::getLastState(int userid) { QString queryStr = QString('SELECT device_state FROM Status WHERE uid = %1 AND device_name = '空调' ORDER BY sid DESC LIMIT 1').arg(userid); QSqlQuery query; if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { qDebug() << '未得到上一次状态: ' << query.lastError().text(); return ''; } }
void AirCondition::startUpdateTimer() { m_updateTimer->start(); // 启动定时器 }
void AirCondition::updateDatabase() { // 更新状态到数据库 QString temp = ui->SwitchStatus->checked() ? QString::number(ui->temperature->getValue()) : '0'; updateSmartHomeStatus(userid, QString('空调'), ui->SwitchStatus->checked() ? QString('开启') : QString('关闭'), temp);
m_updateTimer->stop(); // 停止定时器
}
void AirCondition::closeEvent(QCloseEvent *event) { event->ignore(); // 忽略关闭事件 hide(); // 隐藏界面
// 保存开启按钮的状态到数据库
QString state = ui->SwitchStatus->checked() ? '开启' : '关闭';
updateSmartHomeStatus(userid, '空调', state, '0');
}
// 问题分析: // 关闭按钮和开启按钮的状态是通过数据库中的状态来控制的。 // 当关闭按钮关闭后,温度值会被设置为0,并且在关闭界面时会保存到数据库中。 // 因此,当重新进入界面并点击开启按钮时,温度值会被设置为0。 // 解决方法:在关闭界面时不保存温度值到数据库中,只保存开启按钮的状态。 // 这样,在重新进入界面时,可以根据数据库中的状态来设置开启按钮的状态,而温度值不会被重置为0。 // 修改代码:在 closeEvent 函数中,将保存温度值的代码注释掉或移除,只保留保存开启按钮状态的代码。 // 在重新进入界面时,需要重新加载上次的状态和温度值,以确保界面显示正确的状态。
原文地址: https://www.cveoy.top/t/topic/qmHC 著作权归作者所有。请勿转载和采集!