Qt实现智能家居界面切换和数据同步
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 "";
}
}
// ...其他数据库操作函数...
解释
- 在总览界面中,使用
QComboBox组件让用户选择不同的模式。 - 当用户选择模式后,
on_modeComboBox_currentIndexChanged函数会被触发,该函数会调用updateSmartHomeStatus函数更新数据库中对应设备的状态。 - 在灯光设置界面中,使用
loadLastStatus函数从数据库中读取上次保存的灯光状态,并在界面上进行显示。 loadLastStatus函数会调用getLastBrightness函数从数据库中读取上次保存的亮度值。- 在
Lights类的构造函数中,我们保存了用户ID,以便在后续的数据库操作中使用。
总结
通过以上代码,我们实现了用户在总览界面和灯光设置界面之间切换,并保持SQLite数据库中设备状态的同步更新。这只是一个简单的示例,您可以根据您的需求扩展功能,例如添加更多设备、实现更复杂的控制逻辑等。
注意事项
- 请确保已正确配置SQLite数据库连接。
- 在实际开发中,应根据具体情况进行错误处理和异常处理。
- 为了提高代码的可读性和可维护性,建议将数据库操作封装成单独的类或函数。
- 以上代码仅供参考,实际开发中需要根据具体情况进行调整和修改。
原文地址: https://www.cveoy.top/t/topic/fBad 著作权归作者所有。请勿转载和采集!