Qt智能家居系统:多模式控制和数据同步
Qt智能家居系统:多模式控制和数据同步
本文介绍如何使用Qt实现一个简单的智能家居系统,包括以下功能:
- 用户可以选择不同的模式,如睡眠模式、日常模式、节能模式。- 点击'Lights'界面,数据会根据当前选择的模式同步更新。
代码实现
1. UsersWidget类cpp#include 'userswidget.h'#include 'ui_userswidget.h'#include 'lights.h'#include 'sqlite.h'#include
UsersWidget::UsersWidget(int userid, QWidget *parent) : QWidget(parent), ui(new Ui::UsersWidget), userid(userid) // 保证userid无变化{ ui->setupUi(this); displayUsersWidget();
// 连接模式选择框的currentIndexChanged信号和槽函数 connect(ui->modeComboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged), this, &UsersWidget::on_modeComboBox_currentIndexChanged);
// 点击Lights按钮时,创建并显示Lights窗口 connect(ui->lightsButton, &QPushButton::clicked, this, [=]() { Lights *w = new Lights(userid); w->show(); });}
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 'sqlite.h'#include #include #include
Lights::Lights(int userid, QWidget *parent) : QWidget(parent), ui(new Ui::Lights), userid(userid) // 保证userid无变化{ ui->setupUi(this); lightsWidget();
// 连接开关组件的statusChanged信号和槽函数 connect(ui->switchButton, &SwitchButton::statusChanged, this, &Lights::switchButton_status);
// 连接完成按钮的clicked信号和槽函数 connect(ui->finishedButton, &QPushButton::clicked, this, [=]() { if (ui->switchButton->isChecked()) { QString brightness = QString::number(ui->brightnessSlider->value()); updateSmartHomeStatus(userid, '智能灯', '开启', brightness); } else { updateSmartHomeStatus(userid, '智能灯', '关闭', '0'); } });
// 加载上次更改的状态 loadLastStatus();}
void Lights::loadLastStatus(){ QString state = getLastState(userid); QString brightness = getLastBrightness(userid);
// 根据上次的状态和亮度设置界面上的组件状态 if (state == '开启') { ui->switchButton->setChecked(true); ui->brightnessSlider->setValue(brightness.toInt()); } else { ui->switchButton->setChecked(false); ui->brightnessSlider->setValue(0); }}
QString Lights::getLastBrightness(int userid){ QSqlQuery query; query.prepare('SELECT value FROM Status WHERE uid = :userid AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1'); query.bindValue(':userid', userid); if (!query.exec()) { qDebug() << '获取上次亮度失败:' << query.lastError().text(); return ''; } if (query.next()) { return query.value(0).toString(); } else { return ''; }}
QString Lights::getLastState(int userid){ QSqlQuery query; query.prepare('SELECT device_state FROM Status WHERE uid = :userid AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1'); query.bindValue(':userid', userid); if (!query.exec()) { qDebug() << '获取上次状态失败:' << query.lastError().text(); return ''; } if (query.next()) { return query.value(0).toString(); } else { return ''; }}
void Lights::updateSmartHomeStatus(int userid, const QString &deviceName, const QString &devicestate, const QString &newValue){ QSqlQuery query; query.prepare('INSERT INTO Status (uid, device_name, device_state, value) VALUES (:userid, :deviceName, :devicestate, :newValue)'); query.bindValue(':userid', userid); query.bindValue(':deviceName', deviceName); query.bindValue(':devicestate', devicestate); query.bindValue(':newValue', newValue); if (!query.exec()) { qDebug() << '更新智能家居状态失败:' << query.lastError().text(); }}
代码说明
-
在
UsersWidget类中,当用户选择不同的模式时,会调用updateSmartHomeStatus()函数更新数据库中对应设备的状态和值。 -
在
Lights类中,当用户打开Lights界面时,会调用loadLastStatus()函数从数据库中读取上次保存的设备状态和值,并更新界面上的组件状态。 -
当用户点击'完成'按钮时,会将当前的设备状态和值保存到数据库中。
总结
本文介绍了如何使用Qt实现一个简单的智能家居系统,包括用户选择模式后,点击Lights界面,数据同步更新的功能。希望本文能帮助您了解如何使用Qt进行简单的智能家居系统开发。
原文地址: https://www.cveoy.top/t/topic/fBaQ 著作权归作者所有。请勿转载和采集!