Qt C++ 智能家居系统:用户管理、状态同步与数据库交互/n/n本项目使用 Qt C++ 开发了一个智能家居系统,包含用户管理、状态同步和数据库交互功能。用户可登录系统,查看和控制智能灯、空调、加湿器、窗帘等设备状态。数据库使用 SQLite 存储用户信息和设备状态信息,实现数据持久化。/n/n### 系统架构/n/n系统采用客户端-服务器架构,Qt C++ 作为客户端,负责用户界面交互和数据请求,数据库作为服务器,负责存储数据。/n/n#### 数据库设计/n/n系统数据库包含两个表:/n/n1. 用户表: 存储用户的用户名和密码,用于用户登录验证。/n2. 智能家居状态表: 记录着智能灯开关、智能灯亮度、空调开关、空调温度、加湿器开关、加湿器湿度、窗帘开关、窗帘高度、模式信息(睡眠模式、日常模式、节能模式)。/n/n每个用户对应一个智能家居状态表,通过用户表和智能家居状态表的键值连接进行关联。/n/n#### 客户端功能/n/n1. 用户管理/n - 用户登录/n - 用户注册/n2. 设备控制/n - 智能灯控制(开关、亮度)/n - 空调控制(开关、温度)/n - 加湿器控制(开关、湿度)/n - 窗帘控制(开关、高度)/n - 模式切换/n/n#### 代码示例/n/ncpp/n#include /'manage.h/'/n#include /'users.h/'/n#include /'ui_manage.h/'/n#include /'userswidget.h/'/n#include /'sqlite.h/'/n#include /'reg.h/'/n#include <QPushButton>/n#include <QLineEdit>/n#include <QSqlQuery>/n#include <QSqlDatabase>/n#include <QSqlError>/n#include <QMessageBox>/n#include /'QtDebug/'/n#include <QCloseEvent>/n/nManage::Manage(QWidget *parent) :/n QWidget(parent),/n ui(new Ui::Manage)/n{/n ui->setupUi(this);/n/n connect(ui->loginon,&QPushButton::clicked,this,[=](){loginUser(ui->username->text(),ui->password->text());});/n connect(ui->registe,&QPushButton::clicked,this,[=](){registerUser();});/n}/n/nManage::~Manage()/n{/n delete ui;/n}/n/nvoid Manage::loginUser(QString username,QString passwd)/n{/n Sqlite::sqlite_init();/n QSqlQuery query;/n QString sql=QString(/'SELECT * FROM users WHERE username = //'%1//' AND passwd = //'%2//'/').arg(username).arg(passwd);/n if (!query.exec(sql)) {/n qDebug() << /'查询失败:/' << query.lastError().text();/n/n }/n //判断执行结果/n if(!query.next())/n {/n qDebug() << /'登录失败!/'<<query.lastError();/n QMessageBox::information(this,/'登录认证/',/'登录失败,账户或者密码错误/');/n }/n else/n {/n qDebug() << /'登录成功!/';/n QMessageBox::information(this,/'登录认证/',/'登录成功/');/n // 获取用户ID/n int userId = query.value(/'uid/').toInt();/n StatusUid(userId);/n /n //登录成功后可以跳转到其他页面/n UsersWidget *w = new UsersWidget();/n w->show();/n this->window()->close();//关闭包含组件的窗口/n/n }/n}/n/n/nvoid Manage::registerUser()/n{/n/n this->window()->close();/n Reg *s=new Reg;/n s->show();/n}/n/n#include /'userswidget.h/'/n#include /'ui_userswidget.h/'/n#include /'lights.h/'/n#include /'aircondition.h/'/n#include /'curtains.h/'/n#include /'humidiffer.h/'/n#include /'information.h/'/n#include /'procession.h/'/n#include /'QCloseEvent/'/n#include /'QMessageBox/'/n/nUsersWidget::UsersWidget(QWidget *parent) :/n QWidget(parent),/n ui(new Ui::UsersWidget)/n{/n ui->setupUi(this);/n displayUsersWidget();/n connect(ui->lights,&QToolButton::clicked,this,[=]{Lights *w = new Lights; w->show();});/n connect(ui->air_condition,&QToolButton::clicked,this,[=]{AirCondition *w = new AirCondition; w->show();});/n connect(ui->curtains,&QToolButton::clicked,this,[=]{Curtains *w = new Curtains; w->show();});/n connect(ui->humidifiers,&QToolButton::clicked,this,[=]{Humidiffer *w = new Humidiffer; w->show();});/n connect(ui->tables,&QToolButton::clicked,this,[=]{Information *w = new Information; w->show();});/n connect(ui->wifi,&QToolButton::clicked,this,[=]{Procession *w = new Procession; w->show();});/n/n/n/n}/n/nUsersWidget::~UsersWidget()/n{/n delete ui;/n}/n/nvoid UsersWidget::displayUsersWidget()/n{/n setWindowTitle(/'智能家居总览图/');/n setFixedSize(900,600);/n/n}/n/nvoid UsersWidget::closeEvent(QCloseEvent *e)/n{/n if(e->spontaneous())/n {/n //窗口关闭时弹出的提示窗口/n QMessageBox::StandardButton reply;/n/n reply = QMessageBox::information(this,/'提示/',/'确认退出智能管家系统?/',QMessageBox::Yes|QMessageBox::No);/n if(reply == QMessageBox::Yes){/n //若用户点击确认,则接收这个事件,当前窗口会关闭/n e->accept();/n }else{/n //若用户点击取消,则忽略这个事件,当前窗口不会关闭/n e->ignore();/n }/n }/n}/n/n#ifndef LIGHTS_H/n#define LIGHTS_H/n/n#include <QWidget>/n/nnamespace Ui {/nclass Lights;/n}/n/nclass Lights : public QWidget/n{/n Q_OBJECT/n/npublic:/n explicit Lights(QWidget *parent = nullptr);/n ~Lights();/n void LightsWidget();/n bool flag;/npublic slots:/n bool switchButton_status(bool checked);/n/nprivate:/n Ui::Lights *ui;/n};/n/n#endif // LIGHTS_H/n/n/n#include /'lights.h/'/n#include /'ui_lights.h/'/n#include /'switchform.h/'/n#include /'sqlite.h/'/n#include <QSqlQuery>/n#include <QSqlDatabase>/n#include <QSqlError>/n#include <QDebug>/n/nLights::Lights(QWidget *parent) :/n QWidget(parent),/n ui(new Ui::Lights)/n{/n ui->setupUi(this);/n LightsWidget();/n //连接开关组件的信号和自定义的槽函数/n connect(ui->SwitchStatus,&SwitchForm::statusChanged,this,&Lights::switchButton_status);/n/n // 连接完成按钮的clicked信号和自定义的槽函数/n connect(ui->Finished, &QPushButton::clicked, this,[=]{if(flag){QString brighteness = QString::number(ui->ctrlform->getValue());qDebug()<<brighteness;Sqlite::sqlite_init();updateSmartHomeStatus();} });/n/n/n}/n/nLights::~Lights()/n{/n delete ui;/n}/n/nvoid Lights::LightsWidget()/n{/n setWindowTitle(/'智能灯设置/');/n //设置ui组件背景/n setAutoFillBackground(true);/n QPalette palette=this->palette();/n QPixmap pixmap(/':/user/image/image/light.jpg/');/n palette.setBrush(QPalette::Window, QBrush(pixmap));/n setPalette(palette);/n setFixedSize(600,400);/n}/n/nbool Lights::switchButton_status(bool checked)/n{/n qDebug()<<checked;/n flag=checked;/n return flag;/n}/n/n#include <QSqlDatabase>/n#include <QSqlQuery>/n#include <QMessageBox>/n#include <QDebug>/n#include <QSqlError>/n#include /'sqlite.h/'/n/nSqlite::Sqlite()/n{/n/n}/n/n/nvoid Sqlite::sqlite_init()/n{/n/n QSqlDatabase db = QSqlDatabase::addDatabase(/'QSQLITE/');/n db.setDatabaseName(/'../Smarthome_Client/database/database.db/');/n if(!db.open())/n {/n qDebug() << /'无法打开数据库!/';/n }/n else{/n qDebug() << /'数据库打开成功!/';/n }/n}/n/n/n// 更新智能家居状态表中的数据/nvoid updateSmartHomeStatus(const QString& username, const QString& deviceName, const QString& newValue)/n{/n Sqlite::sqlite_init();/n // 执行更新操作/n QSqlQuery query;/n QString sql = QString(/'UPDATE status SET %1 = :newValue WHERE username = :username/')/n .arg(deviceName);/n query.prepare(sql);/n query.bindValue(/':newValue/', newValue);/n query.bindValue(/':username/', username);/n/n if (!query.exec()) {/n qDebug() << /'更新数据失败:/' << query.lastError().text();/n } else {/n qDebug() << /'数据更新成功/';/n }/n}/n/nvoid StatusUid(int userId)/n{/n Sqlite::sqlite_init();/n QSqlQuery query;/n // 查询智能家居状态表,获取用户对应的状态/n query.prepare(/'SELECT * FROM status WHERE user_id = :userId/');/n query.bindValue(/':userId/', userId);/n qDebug()<<query.exec();/n if (!query.next()) {/n qDebug() << /'Failed to execute query!/'<<query.lastError().text();/n }/n}/n/n/n### 在 Lights 界面使用 Manage 获取的 userId 内容/n/n为了在 Lights 界面中使用 Manage 获取的 userId 内容,需要将 userId 作为参数传递给 Lights 类,并在 Lights 类中存储该值。/n/n1. 在 UsersWidget 类中,将 userId 作为参数传递给 Lights 类的构造函数:/n/ncpp/nconnect(ui->lights, &QToolButton::clicked, this, [=]{/n Lights *w = new Lights(userId);/n w->show();/n});/n/n/n2. 在 Lights 类的头文件中添加一个成员变量 userId,并将其作为构造函数的参数:/n/ncpp/nclass Lights : public QWidget/n{/n Q_OBJECT/n/npublic:/n explicit Lights(int userId, QWidget *parent = nullptr);/n // .../nprivate:/n int userId;/n // .../n};/n/n/n3. 在构造函数中初始化 userId 成员变量:/n/ncpp/nLights::Lights(int userId, QWidget *parent) :/n QWidget(parent),/n ui(new Ui::Lights),/n userId(userId)/n{/n // .../n}/n/n/n4. 在需要使用 userId 的地方进行调用,例如在 Lights 类的 updateSmartHomeStatus 函数中:/n/ncpp/nvoid Lights::updateSmartHomeStatus(const QString& deviceName, const QString& newValue)/n{/n Sqlite::sqlite_init();/n // 执行更新操作/n QSqlQuery query;/n QString sql = QString(/'UPDATE status SET %1 = :newValue WHERE user_id = :userId/')/n .arg(deviceName);/n query.prepare(sql);/n query.bindValue(/':newValue/', newValue);/n query.bindValue(/':userId/', userId);/n/n if (!query.exec()) {/n qDebug() << /'更新数据失败:/' << query.lastError().text();/n } else {/n qDebug() << /'数据更新成功/';/n }/n}/n/n/n通过以上步骤,就可以在 Lights 界面中使用 Manage 获取的 userId 了。/n/n### 总结/n/n本项目实现了使用 Qt C++ 开发的智能家居系统,包含用户管理、状态同步和数据库交互功能。通过数据库连接,可以实现用户登录验证和设备状态的持久化存储。通过传递用户 ID 参数,可以让各个子界面访问相关数据,完成用户身份识别和设备状态的控制。/n/n### 未来展望/n/n未来可以进一步优化系统,例如:/n/n- 实现更完善的设备控制功能,例如定时任务、场景模式等。/n- 支持更多类型的智能家居设备。/n- 采用云平台进行数据存储和设备控制,提高系统可扩展性和安全性。/n/n希望本项目可以为想要开发智能家居系统的开发者提供一些参考。/n/

Qt C++ 智能家居系统:用户管理、状态同步与数据库交互

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

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