Qt C++实现基于SQLite数据库的智能家居系统

本项目使用Qt C++框架和SQLite数据库实现一个简单的智能家居系统,涵盖以下功能:

  • 用户登录和注册
  • 智能家居状态管理(智能灯、空调、加湿器、窗帘、模式)
  • 用户界面控制智能家居设备

数据库设计

数据库包含两个表:

  1. 用户表 (users)

    • uid (INTEGER PRIMARY KEY): 用户ID
    • username (TEXT): 用户名
    • passwd (TEXT): 密码
  2. 智能家居状态表 (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数据库开发一个简单的智能家居系统。通过以上代码示例,您可以了解到如何进行数据库操作、用户登录注册、以及智能家居设备控制等功能的实现。您可以根据自己的需求扩展功能,例如添加更多类型的智能家居设备、实现更复杂的控制逻辑等。

Qt C++实现基于SQLite数据库的智能家居系统

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

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