Qt C++实现基于SQLite数据库的智能家居系统
Qt C++实现基于SQLite数据库的智能家居系统
本项目使用Qt C++框架和SQLite数据库实现一个简单的智能家居系统,涵盖以下功能:
- 用户登录和注册
- 智能家居状态管理(智能灯、空调、加湿器、窗帘、模式)
- 用户界面控制智能家居设备
数据库设计
数据库包含两个表:
-
用户表 (users)
- uid (INTEGER PRIMARY KEY): 用户ID
- username (TEXT): 用户名
- passwd (TEXT): 密码
-
智能家居状态表 (status)
- status_id (INTEGER PRIMARY KEY): 状态ID
- user_id (INTEGER): 用户ID,与用户表关联
- light_switch (TEXT): 智能灯开关状态
- light_brightness (TEXT): 智能灯亮度
- ac_switch (TEXT): 空调开关状态
- ac_temperature (TEXT): 空调温度
- humidifier_switch (TEXT): 加湿器开关状态
- humidifier_humidity (TEXT): 加湿器湿度
- curtain_switch (TEXT): 窗帘开关状态
- curtain_height (TEXT): 窗帘高度
- mode (TEXT): 模式信息(睡眠模式、日常模式、节能模式)
代码实现
1. 数据库初始化 (sqlite.h/cpp)
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
class Sqlite
{
public:
Sqlite();
static void sqlite_init();
};
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 QString& username, const QString& deviceName, const QString& newValue)
{
Sqlite::sqlite_init();
// 执行更新操作
QSqlQuery query;
QString sql = QString('UPDATE status SET %1 = :newValue WHERE username = :username')
.arg(deviceName);
query.prepare(sql);
query.bindValue(':newValue', newValue);
query.bindValue(':username', username);
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();
}
}
2. 用户登录和注册 (manage.h/cpp, reg.h/cpp)
// manage.h
#ifndef MANAGE_H
#define MANAGE_H
#include <QWidget>
namespace Ui {
class Manage;
}
class Manage : public QWidget
{
Q_OBJECT
public:
explicit Manage(QWidget *parent = nullptr);
~Manage();
private slots:
void loginUser(QString username, QString passwd);
void registerUser();
private:
Ui::Manage *ui;
};
#endif // MANAGE_H
// manage.cpp
#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, '登录认证', '登录成功');
int userId = query.value('uid').toInt();
StatusUid(userId);
UsersWidget *w = new UsersWidget(userId); // 将userId传递给UsersWidget
w->show();
this->window()->close();
}
}
void Manage::registerUser()
{
this->window()->close();
Reg *s = new Reg;
s->show();
}
3. 智能家居总览界面 (userswidget.h/cpp)
// userswidget.h
#ifndef USERSWIDGET_H
#define USERSWIDGET_H
#include <QWidget>
class UsersWidget : public QWidget
{
Q_OBJECT
public:
explicit UsersWidget(int userId, QWidget *parent = nullptr); // 添加userId参数
~UsersWidget();
private:
int userId; // 添加userId成员变量
// ...
};
#endif // USERSWIDGET_H
// userswidget.cpp
#include 'userswidget.h'
#include 'ui_userswidget.h'
#include 'lights.h'
// ...
#include <QCloseEvent>
#include <QMessageBox>
UsersWidget::UsersWidget(int userId, QWidget *parent) : // 构造函数接收userId参数
QWidget(parent),
ui(new Ui::UsersWidget),
userId(userId) // 保存userId到成员变量
{
ui->setupUi(this);
displayUsersWidget();
// ...
}
UsersWidget::~UsersWidget()
{
delete ui;
}
void UsersWidget::displayUsersWidget()
{
setWindowTitle('智能家居总览图');
setFixedSize(900, 600);
// 创建Lights对象时传递userId参数
Lights *w = new Lights(userId);
w->show();
}
// ...
4. 智能灯控制界面 (lights.h/cpp)
// lights.h
#ifndef LIGHTS_H
#define LIGHTS_H
#include <QWidget>
class Lights : public QWidget
{
Q_OBJECT
public:
explicit Lights(int userId, QWidget *parent = nullptr); // 添加userId参数
~Lights();
// ...
private:
int userId; // 添加userId成员变量
// ...
};
#endif // LIGHTS_H
// lights.cpp
#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);
connect(ui->Finished, &QPushButton::clicked, this, [=]{
if (flag)
{
QString brighteness = QString::number(ui->ctrlform->getValue());
qDebug() << brighteness;
Sqlite::sqlite_init();
// 使用userId更新数据库
updateSmartHomeStatus(userId, 'light_brightness', brighteness);
}
});
}
Lights::~Lights()
{
delete ui;
}
// ...
总结
本文介绍了如何使用Qt C++和SQLite数据库开发一个简单的智能家居系统。通过以上代码示例,您可以了解到如何进行数据库操作、用户登录注册、以及智能家居设备控制等功能的实现。您可以根据自己的需求扩展功能,例如添加更多类型的智能家居设备、实现更复杂的控制逻辑等。
原文地址: https://www.cveoy.top/t/topic/fAs7 著作权归作者所有。请勿转载和采集!