Qt 智能灯设置功能优化:SwitchForm 组件状态更新与数据库同步

本文将针对以下问题给出解决方案:

  1. 在 UI 界面上,当 SwitchForm 组件开启时,ctrlform 组件才应显示亮度值,否则应显示默认值。
  2. 从数据库读取的 device_status 和 value 值无法正确反映实际状态。
  3. SwitchForm 组件本身存在缺陷,只能通过点击事件判断开启或关闭状态。

问题分析

原始代码中,switchButton_status 函数仅修改了 flag 变量,并没有更新 SwitchForm 组件的状态。因此,在 loadLastStatus 函数中,调用 getLastState 函数时,得到的始终是初始状态。

此外,代码中定义了 flag 变量保存 SwitchForm 状态,但在 loadLastStatussaveLastStatus 函数中没有使用它,而是直接调用了 SwitchForm 组件的 getstate 函数,导致代码冗余。

最后,在数据库操作中,getLastBrightnessgetLastState 函数使用了 ORDER BY 子句和 LIMIT 1 来获取最新的记录,但在 updateLastBrightness 函数中没有更新 sid 字段,导致查询结果可能并非最新的记录。

解决方案

  1. 更新 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;
    }
    
  2. 统一管理状态:loadLastStatussaveLastStatus 函数中使用 flag 变量,避免多次调用 SwitchForm 组件的 getstate 函数。

  3. 改进数据库操作:updateLastBrightness 函数中更新 sid 字段,以确保查询到的记录是最新的。

  4. 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 组件进行改进,添加信号通知其他组件状态变化,以实现更完善的智能灯设置功能。

Qt 智能灯设置功能优化:SwitchForm 组件状态更新与数据库同步

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

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