这段代码存在一些问题,需要进行修改和补充。以下是修改后的代码:

userswidget.h

#ifndef USERSWIDGET_H
#define USERSWIDGET_H

#include <QWidget>

namespace Ui {
class UsersWidget;
}

class UsersWidget : public QWidget
{
    Q_OBJECT

public:
    explicit UsersWidget(int userid, QWidget *parent = nullptr);
    ~UsersWidget();

private slots:
    void on_modeComboBox_currentIndexChanged(const QString &mode);

private:
    Ui::UsersWidget *ui;
    int userid;

    void displayUsersWidget();
    void closeEvent(QCloseEvent *e);
    void updateSmartHomeStatus(int userId, QString deviceName, QString devicestate, QString newValue);
    bool statusUid(int userId);
};

#endif // USERSWIDGET_H

userswidget.cpp

#include "userswidget.h"
#include "ui_userswidget.h"
#include "sqlite.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(int userid, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::UsersWidget),
    userid(userid)
{
    ui->setupUi(this);
    displayUsersWidget();
    connect(ui->lights, &QToolButton::clicked, this, [=]{
        Lights *w = new Lights(userid);
        w->show();
    });
    connect(ui->air_condition, &QToolButton::clicked, this, [=]{
        AirCondition *w = new AirCondition(userid);
        w->show();
    });
    connect(ui->curtains, &QToolButton::clicked, this, [=]{
        Curtains *w = new Curtains(userid);
        w->show();
    });
    connect(ui->humidifiers, &QToolButton::clicked, this, [=]{
        Humidiffer *w = new Humidiffer(userid);
        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();
    });
    connect(ui->mode, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(on_modeComboBox_currentIndexChanged(const QString&)));
}

UsersWidget::~UsersWidget()
{
    delete ui;
}

void UsersWidget::displayUsersWidget()
{
    setWindowTitle('智能家居总览图');
    setFixedSize(900, 600);
}

void UsersWidget::on_modeComboBox_currentIndexChanged(const QString &mode)
{
    if (mode == '睡眠模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '20');
        updateSmartHomeStatus(userid, '空调', '开启', '27');
        updateSmartHomeStatus(userid, '加湿器', '开启', '50');
        updateSmartHomeStatus(userid, '窗帘', '开启', '100');
    } else if (mode == '日常模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '80');
        updateSmartHomeStatus(userid, '空调', '开启', '25');
        updateSmartHomeStatus(userid, '加湿器', '开启', '60');
        updateSmartHomeStatus(userid, '窗帘', '开启', '50');
    } else if (mode == '节能模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '50');
        updateSmartHomeStatus(userid, '空调', '开启', '26');
        updateSmartHomeStatus(userid, '加湿器', '开启', '40');
        updateSmartHomeStatus(userid, '窗帘', '开启', '30');
    }
}

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();
        }
    }
}

sqlite.cpp

#include "sqlite.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>

Sqlite::Sqlite()
{

}

void Sqlite::sqlite_init()
{
    // 先关闭重复的数据库连接
    if (QSqlDatabase::contains('qt_sql_default_connection')) {
        QSqlDatabase::removeDatabase('qt_sql_default_connection');
    }
    QSqlDatabase db = QSqlDatabase::addDatabase('QSQLITE');
    db.setDatabaseName('../Smarthome_Client/database/database.db');
    if (!db.open()) {
        qDebug() << '无法打开数据库!';
    } else {
        qDebug() << '数据库打开成功!';
    }
}

void Sqlite::updateSmartHomeStatus(int userId, QString deviceName, QString devicestate, QString newValue)
{
    sqlite_init();
    // 执行更新操作
    QSqlQuery query;
    query.prepare('SELECT * FROM Status WHERE uid = :userId');
    query.bindValue(':userId', userId);
    if (!query.exec()) {
        qDebug() << '查询id失败:' << query.lastError().text();
    }
    QString sql = QString('INSERT INTO Status (uid, device_name, device_state, value) VALUES (%1, '%2', '%3', '%4')').arg(userId).arg(deviceName).arg(devicestate).arg(newValue);
    query.prepare(sql);
    if (!query.exec()) {
        qDebug() << '插入数据失败:' << query.lastError().text();
        return;
    }
}

bool Sqlite::statusUid(int userId)
{
    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();
        return false;
    } else {
        qDebug() << 'Successed to execute query!';
        return true;
    }
}

注意事项:

  1. Sqlite类的成员函数需要在定义时加上类名作为前缀,以指明其所属类。
  2. Sqlite类的成员函数需要在实现文件中进行定义。
  3. Sqlite类的成员函数的定义需要加上Sqlite::作为前缀,以指明其所属类。
  4. updateSmartHomeStatus函数中,需要使用Sqlite::sqlite_init()进行数据库初始化,而不是直接调用sqlite_init()
  5. statusUid函数中,需要使用Sqlite::sqlite_init()进行数据库初始化,而不是直接调用sqlite_init()

此外,还需要在主程序中包含userswidget.hsqlite.h头文件,并创建UsersWidget对象进行使用。

代码优化:

  • 使用了QStringarg函数进行字符串拼接,提高了代码的可读性和可维护性。
  • 使用了Qt信号槽机制,使得代码更加清晰易懂。
  • 添加了数据库操作的错误处理,提高了代码的健壮性。

代码功能:

  • 用户可以通过选择QComboBox来切换模式,例如睡眠模式、日常模式、节能模式。
  • 每个模式对应不同的智能家居设备状态,例如智能灯的亮度、空调的温度等。
  • 代码会根据用户选择的模式,更新SQLite数据库中的智能家居设备状态。

下一步:

  • 可以使用Qt的网络库,将智能家居设备状态同步到服务器。
  • 可以实现智能家居设备的远程控制功能。
  • 可以增加用户管理功能,例如用户登录、注册等。

总结:

本示例展示了如何使用Qt开发智能家居系统,实现了用户模式切换功能,并通过SQLite数据库记录和更新智能家居设备状态。代码使用Qt的信号槽机制、QStringarg函数以及数据库操作的错误处理,使代码更加清晰易懂、健壮性更高。用户可以通过选择QComboBox来切换模式,代码会根据选择的模式更新智能家居设备状态,并将状态保存到SQLite数据库中。下一步可以考虑实现远程控制、用户管理等功能,进一步完善智能家居系统。

Qt 智能家居系统:用户模式切换与数据库交互

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

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