Qt 智能灯设置功能优化:SwitchForm 组件状态更新与数据库同步
Qt 智能灯设置功能优化:SwitchForm 组件状态更新与数据库同步
本文将针对以下问题给出解决方案:
- 在 UI 界面上,当 SwitchForm 组件开启时,ctrlform 组件才应显示亮度值,否则应显示默认值。
- 从数据库读取的 device_status 和 value 值无法正确反映实际状态。
- SwitchForm 组件本身存在缺陷,只能通过点击事件判断开启或关闭状态。
问题分析
原始代码中,switchButton_status 函数仅修改了 flag 变量,并没有更新 SwitchForm 组件的状态。因此,在 loadLastStatus 函数中,调用 getLastState 函数时,得到的始终是初始状态。
此外,代码中定义了 flag 变量保存 SwitchForm 状态,但在 loadLastStatus 和 saveLastStatus 函数中没有使用它,而是直接调用了 SwitchForm 组件的 getstate 函数,导致代码冗余。
最后,在数据库操作中,getLastBrightness 和 getLastState 函数使用了 ORDER BY 子句和 LIMIT 1 来获取最新的记录,但在 updateLastBrightness 函数中没有更新 sid 字段,导致查询结果可能并非最新的记录。
解决方案
-
更新 SwitchForm 状态: 修改
switchButton_status函数,将flag值传递给 SwitchForm 组件的setChecked函数,以更新 SwitchForm 的状态。修改后的代码如下:bool Lights::switchButton_status(bool checked) { qDebug() << checked; flag = checked; ui->SwitchStatus->setChecked(checked); // 更新 SwitchForm 状态 if (checked) { ui->ctrlform->setEnabled(true); } else { ui->ctrlform->setEnabled(false); } return flag; } -
统一管理状态: 在
loadLastStatus和saveLastStatus函数中使用flag变量,避免多次调用 SwitchForm 组件的getstate函数。 -
改进数据库操作: 在
updateLastBrightness函数中更新sid字段,以确保查询到的记录是最新的。 -
SwitchForm 组件改进: 为了解决 SwitchForm 组件只能通过点击事件判断状态的问题,可以考虑添加一个信号,用于通知其他组件 SwitchForm 的状态变化。例如,可以添加一个
stateChanged信号,在setChecked函数中发射该信号,并将当前状态作为参数传递。
修改后的代码
// ...
bool Lights::switchButton_status(bool checked)
{
qDebug() << checked;
flag = checked;
ui->SwitchStatus->setChecked(checked); // 更新 SwitchForm 状态
if (checked) {
ui->ctrlform->setEnabled(true);
} else {
ui->ctrlform->setEnabled(false);
}
return flag;
}
void Lights::loadLastStatus()
{
qDebug() << this->userid;
QString state = getLastState(this->userid);
QString brightness = getLastBrightness(this->userid);
qDebug() << '1' << state;
if (state == '开启') {
flag = true; // 使用 flag 变量保存状态
ui->SwitchStatus->setChecked(true);
ui->ctrlform->setEnabled(true);
ui->ctrlform->setValue(brightness.toInt());
} else {
flag = false; // 使用 flag 变量保存状态
ui->SwitchStatus->setChecked(false);
ui->ctrlform->setEnabled(false);
ui->ctrlform->setValue(0);
}
qDebug() << brightness.toInt();
}
void Lights::saveLastStatus()
{
qDebug() << this->flag;
QString status = QString(flag); // 使用 flag 变量获取状态
QString brightness = QString::number(ui->ctrlform->getValue());
updateLastBrightness(this->userid, brightness, status);
}
QString Lights::getLastBrightness(int userid)
{
// ...
}
QString Lights::getLastState(int userid)
{
// ...
}
void Lights::updateLastBrightness(int userid, QString brightness, QString state)
{
Sqlite::sqlite_init();
QString queryStr = QString('UPDATE Status SET value = '%1', device_state = '%2', sid = sid + 1 WHERE uid = %3 AND device_name = '智能灯'').arg(brightness).arg(state).arg(userid); // 更新 sid 字段
QSqlQuery query;
if (!query.exec(queryStr)) {
qDebug() << '更新亮度失败: ' << query.lastError().text();
}
}
// ...
总结
通过以上修改,可以解决 SwitchForm 组件状态更新与数据库同步问题,并提高代码可读性和可维护性。同时,建议对 SwitchForm 组件进行改进,添加信号通知其他组件状态变化,以实现更完善的智能灯设置功能。
原文地址: http://www.cveoy.top/t/topic/fATu 著作权归作者所有。请勿转载和采集!