Qt实现智能家居界面切换和数据同步

概述

本篇博客演示如何使用Qt框架构建一个简单的智能家居系统,重点关注用户界面切换和数据同步。

功能描述

用户在总览界面(UserWidget)选择不同的模式(例如睡眠模式、日常模式、节能模式)时,会改变SQLite数据库Status表中对应设备的状态数据。当用户切换到灯光设置界面(Lights)时,界面上的灯光亮度应该与数据库中保存的亮度值保持一致。

代码实现

以下是关键代码片段:

1. UserWidget.cpp

#include "userswidget.h"
#include "ui_userswidget.h"
#include "sqlite.h"
#include "lights.h"
// ...其他头文件...

UsersWidget::UsersWidget(int userid, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::UsersWidget)
{
    ui->setupUi(this);
    displayUsersWidget();

    // 连接信号和槽,打开灯光设置界面
    connect(ui->lights, &QToolButton::clicked, this, [=]{
        Lights *w = new Lights(userid);
        w->show();
    });
    // ...其他界面打开逻辑...

    // 连接模式选择下拉框
    connect(ui->mode, QOverload<const QString&>::of(&QComboBox::currentIndexChanged), this, [this](const QString& mode){
        on_modeComboBox_currentIndexChanged(mode);
    });
}

// ...其他函数...

void UsersWidget::on_modeComboBox_currentIndexChanged(const QString &mode)
{
    if (mode == '睡眠模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '20');
        // ...更新其他设备状态...
    } else if (mode == '日常模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '80');
        // ...更新其他设备状态...
    } else if (mode == '节能模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '50');
        // ...更新其他设备状态...
    }
}

2. Lights.cpp

#include "lights.h"
#include "ui_lights.h"
#include "switchform.h"
#include "sqlite.h"
// ...其他头文件...

Lights::Lights(int userid, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Lights),
    userid(userid) // 保存用户ID
{
    ui->setupUi(this);
    lightsWidget();

    // ...其他初始化逻辑...

    // 加载上次更改的状态
    loadLastStatus();
}

// ...其他函数...

void Lights::showEvent(QShowEvent *event)
{
    // 当页面显示时,加载上次更改的状态
    loadLastStatus();
    event->accept();
}

void Lights::loadLastStatus()
{
    QString state = getLastState(this->userid);
    QString brightness = getLastBrightness(this->userid);

    if (state == '开启') {
        ui->SwitchStatus->setChecked(true);
        ui->ctrlform->setValue(brightness.toInt());
    } else {
        ui->SwitchStatus->setChecked(false);
        ui->ctrlform->setValue(0);
    }

    // ...其他逻辑...
}

QString Lights::getLastBrightness(int userid)
{
    Sqlite::sqlite_init(); // 初始化数据库连接
    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 "";
    }
}

// ...其他数据库操作函数...

解释

  1. 在总览界面中,使用QComboBox组件让用户选择不同的模式。
  2. 当用户选择模式后,on_modeComboBox_currentIndexChanged函数会被触发,该函数会调用updateSmartHomeStatus函数更新数据库中对应设备的状态。
  3. 在灯光设置界面中,使用loadLastStatus函数从数据库中读取上次保存的灯光状态,并在界面上进行显示。
  4. loadLastStatus函数会调用getLastBrightness函数从数据库中读取上次保存的亮度值。
  5. Lights类的构造函数中,我们保存了用户ID,以便在后续的数据库操作中使用。

总结

通过以上代码,我们实现了用户在总览界面和灯光设置界面之间切换,并保持SQLite数据库中设备状态的同步更新。这只是一个简单的示例,您可以根据您的需求扩展功能,例如添加更多设备、实现更复杂的控制逻辑等。

注意事项

  • 请确保已正确配置SQLite数据库连接。
  • 在实际开发中,应根据具体情况进行错误处理和异常处理。
  • 为了提高代码的可读性和可维护性,建议将数据库操作封装成单独的类或函数。
  • 以上代码仅供参考,实际开发中需要根据具体情况进行调整和修改。
Qt实现智能家居界面切换和数据同步

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

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