Qt C++ 智能家居系统开发:数据库连接、用户管理和设备控制
Qt C++ 智能家居系统开发:数据库连接、用户管理和设备控制
本项目使用 Qt C++ 语言开发一个智能家居系统,包含用户管理、设备控制和数据库连接功能。系统使用 SQLite 数据库存储用户数据和智能家居设备状态,用户可以通过客户端界面登录、管理设备,并实时更新设备状态到数据库。
数据库设计
系统包含两个数据库表:
- **用户表:**存储用户的用户名和密码。
- **智能家居状态表:**记录着智能灯开关、智能灯亮度、空调开关、空调温度、加湿器开关、加湿器湿度、窗帘开关、窗帘高度、模式信息(睡眠模式、日常模式、节能模式)。
一个用户对应一个智能家居状态表,靠用户表和智能家居状态表的键值连接。
客户端实现
Qt C++ 作为客户端,首先在用户管理界面输入用户名和密码登录,进入在不同的界面对智能灯、空调、加湿器、窗帘、模式进行更改,使用 void updateSmartHomeStatus(const int userid, const QString& deviceName, const QString& newValue) 更新数据库表。
代码示例
#include "manage.h"
#include "users.h"
#include "ui_manage.h"
#include "userswidget.h"
#include "sqlite.h"
#include "reg.h"
#include <QPushButton>
#include <QLineEdit>
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlError>
#include <QMessageBox>
#include "QtDebug"
#include <QCloseEvent>
Manage::Manage(QWidget *parent) :
QWidget(parent),
ui(new Ui::Manage)
{
ui->setupUi(this);
connect(ui->loginon,&QPushButton::clicked,this,[=](){loginUser(ui->username->text(),ui->password->text());});
connect(ui->registe,&QPushButton::clicked,this,[=](){registerUser();});
}
Manage::~Manage()
{
delete ui;
}
void Manage::loginUser(QString username,QString passwd)
{
Sqlite::sqlite_init();
QSqlQuery query;
QString sql=QString("SELECT * FROM users WHERE username = '%1' AND passwd = '%2'").arg(username).arg(passwd);
if (!query.exec(sql)) {
qDebug() << "查询失败:" << query.lastError().text();
}
//判断执行结果
if(!query.next())
{
qDebug() << "登录失败!"<<query.lastError();
QMessageBox::information(this,"登录认证","登录失败,账户或者密码错误");
}
else
{
qDebug() << "登录成功!";
QMessageBox::information(this,"登录认证","登录成功");
// 获取用户ID
int userId = query.value("uid").toInt();
StatusUid(userId);
//登录成功后可以跳转到其他页面
UsersWidget *w = new UsersWidget();
w->show();
this->window()->close();//关闭包含组件的窗口
}
}
void Manage::registerUser()
{
this->window()->close();
Reg *s=new Reg;
s->show();
}
#include "userswidget.h"
#include "ui_userswidget.h"
#include "lights.h"
#include "aircondition.h"
#include "curtains.h"
#include "humidiffer.h"
#include "information.h"
#include "procession.h"
#include "QCloseEvent"
#include "QMessageBox"
UsersWidget::UsersWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::UsersWidget)
{
ui->setupUi(this);
displayUsersWidget();
connect(ui->lights,&QToolButton::clicked,this,[=]{
Lights *w = new Lights(userId); // 传递 userId
w->show();});
connect(ui->air_condition,&QToolButton::clicked,this,[=]{
AirCondition *w = new AirCondition;
w->show();});
connect(ui->curtains,&QToolButton::clicked,this,[=]{
Curtains *w = new Curtains;
w->show();});
connect(ui->humidifiers,&QToolButton::clicked,this,[=]{
Humidiffer *w = new Humidiffer;
w->show();});
connect(ui->tables,&QToolButton::clicked,this,[=]{
Information *w = new Information;
w->show();});
connect(ui->wifi,&QToolButton::clicked,this,[=]{
Procession *w = new Procession;
w->show();});
}
UsersWidget::~UsersWidget()
{
delete ui;
}
void UsersWidget::displayUsersWidget()
{
setWindowTitle("智能家居总览图");
setFixedSize(900,600);
}
void UsersWidget::closeEvent(QCloseEvent *e)
{
if(e->spontaneous())
{
//窗口关闭时弹出的提示窗口
QMessageBox::StandardButton reply;
reply = QMessageBox::information(this,"提示","确认退出智能管家系统?",QMessageBox::Yes|QMessageBox::No);
if(reply == QMessageBox::Yes){
//若用户点击确认,则接收这个事件,当前窗口会关闭
e->accept();
}else{
//若用户点击取消,则忽略这个事件,当前窗口不会关闭
e->ignore();
}
}
}
#include "lights.h"
#include "ui_lights.h"
#include "switchform.h"
#include "sqlite.h"
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
Lights::Lights(int userId, QWidget *parent) : // 添加 userId 参数
QWidget(parent),
ui(new Ui::Lights),
userId(userId) // 保存 userId
{
ui->setupUi(this);
LightsWidget();
//连接开关组件的信号和自定义的槽函数
connect(ui->SwitchStatus,&SwitchForm::statusChanged,this,&Lights::switchButton_status);
// 连接完成按钮的clicked信号和自定义的槽函数
connect(ui->Finished, &QPushButton::clicked, this,[=]{
if(flag)
{
QString brighteness = QString::number(ui->ctrlform->getValue());
qDebug()<<brighteness;
Sqlite::sqlite_init();
updateSmartHomeStatus(userId, "light", brighteness); // 使用 userId 更新数据
}
});
}
Lights::~Lights()
{
delete ui;
}
void Lights::LightsWidget()
{
setWindowTitle("智能灯设置");
//设置ui组件背景
setAutoFillBackground(true);
QPalette palette=this->palette();
QPixmap pixmap(":/user/image/image/light.jpg");
palette.setBrush(QPalette::Window, QBrush(pixmap));
setPalette(palette);
setFixedSize(600,400);
}
bool Lights::switchButton_status(bool checked)
{
qDebug()<<checked;
flag=checked;
return flag;
}
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
#include "sqlite.h"
Sqlite::Sqlite()
{
}
void Sqlite::sqlite_init()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("../Smarthome_Client/database/database.db");
if(!db.open())
{
qDebug() << "无法打开数据库!";
}
else{
qDebug() << "数据库打开成功!";
}
}
// 更新智能家居状态表中的数据
void updateSmartHomeStatus(const int userId, const QString& deviceName, const QString& newValue)
{
Sqlite::sqlite_init();
// 执行更新操作
QSqlQuery query;
QString sql = QString("UPDATE status SET %1 = :newValue WHERE user_id = :userId")
.arg(deviceName);
query.prepare(sql);
query.bindValue(":newValue", newValue);
query.bindValue(":userId", userId);
if (!query.exec()) {
qDebug() << "更新数据失败:" << query.lastError().text();
} else {
qDebug() << "数据更新成功";
}
}
void StatusUid(int userId)
{
Sqlite::sqlite_init();
QSqlQuery query;
// 查询智能家居状态表,获取用户对应的状态
query.prepare("SELECT * FROM status WHERE user_id = :userId");
query.bindValue(":userId", userId);
qDebug()<<query.exec();
if (!query.next()) {
qDebug() << "Failed to execute query!"<<query.lastError().text();
}
}
说明
- 以上代码仅供参考,实际开发过程中需要根据具体需求进行调整。
- 在
UsersWidget中,创建Lights对象时,需要将从Manage类中获取的userId作为参数传递给Lights类的构造函数。 - 在
Lights类中,通过this->userId获取userId,并在updateSmartHomeStatus函数中使用它来更新数据库。 - 需要注意的是,
userId在整个系统中应该作为一个全局变量,以便不同的界面之间能够共享数据。
其他
- 除了上述示例代码外,还可以在
Lights类中添加其他功能,例如显示灯泡的当前亮度等。 - 可以在其他设备界面 (例如空调、窗帘) 中实现类似的功能。
- 建议使用 Qt 的信号槽机制来实现界面之间的通信。
- 确保在应用程序退出时关闭数据库连接。
希望以上代码和说明能够帮助你开发自己的智能家居系统。
原文地址: https://www.cveoy.top/t/topic/fAsT 著作权归作者所有。请勿转载和采集!