#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();
    void displayUsersWidget();
    void loadLastStatus();//加载上一次的状态
    void saveLastStatus(); // 保存当前更改的状态
    QString getLastState(int userid);//得到上一次的状态信息
    void updateLastMode(int userid,QString mode);//更新模式信息

protected:
    void closeEvent(QCloseEvent *);

signals:
    void modeChanged(const QString &mode); // 添加信号

private slots:
    void on_mode_currentIndexChanged(int index);

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

#endif // USERSWIDGET_H


#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 <QSqlQuery>
#include <QCloseEvent>
#include <QComboBox>
#include <QMessageBox>
#include <QSqlError>

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(userid);
        w->show();});
    //模式信号和槽连接
    connect(ui->mode, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &UsersWidget::on_mode_currentIndexChanged);
    loadLastStatus();




}

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

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

}

void UsersWidget::loadLastStatus()
{
    qDebug()<<this->userid;
    QString state = getLastState(this->userid);
    qDebug()<<state;
    if (state.compare('日常模式') == 0) {
        ui->mode->setCurrentIndex(1);
    } else if (state.compare('睡眠模式') == 0) {
        ui->mode->setCurrentIndex(2);
    } else if (state.compare('节能模式') == 0) {
        ui->mode->setCurrentIndex(3);
    } else {
        ui->mode->setCurrentIndex(0);
    }

}

void UsersWidget::saveLastStatus()
{
    qDebug()<<this->userid;
    QString Mode = ui->mode->currentData().toString();
    updateLastMode(this->userid, Mode);

}

void UsersWidget::on_mode_currentIndexChanged(int mode)
{
    switch (mode)
    {
        case 1:
        {
        updateSmartHomeStatus(userid, '智能灯', '关闭', '0');
        updateSmartHomeStatus(userid, '空调', '开启', '25');
        updateSmartHomeStatus(userid, '加湿器', '开启', '60');
        updateSmartHomeStatus(userid, '窗帘', '开启', '50');

        break;
        }
        case 2:
        {
        updateSmartHomeStatus(userid, '智能灯', '开启', '20');
        updateSmartHomeStatus(userid, '空调', '开启', '27');
        updateSmartHomeStatus(userid, '加湿器', '开启', '50');
        updateSmartHomeStatus(userid, '窗帘', '开启', '100');
        break;
        }
        case 3:
        {
        updateSmartHomeStatus(userid, '智能灯', '开启', '50');
        updateSmartHomeStatus(userid, '空调', '开启', '26');
        updateSmartHomeStatus(userid, '加湿器', '开启', '40');
        updateSmartHomeStatus(userid, '窗帘', '开启', '30');
        break;
        }
        default:;

    }
    saveLastStatus();
}

QString UsersWidget::getLastState(int userid)
{
    Sqlite::sqlite_init();
    QString queryStr = QString('SELECT mode FROM Status WHERE uid = %1  ORDER BY sid DESC LIMIT 1').arg(userid);
    qDebug()<<queryStr<<userid;
    QSqlQuery query;
    qDebug ()<<query.exec(queryStr);
    if (query.exec(queryStr) && query.next())
    {
        return query.value(0).toString();
    }
    else
    {
        qDebug() << '得到上一次状态错误: ' << query.lastError().text();
        return '';
    }
}

void UsersWidget::updateLastMode(int userid,QString mode)
{
    Sqlite::sqlite_init();
    QString queryStr = QString('UPDATE Status SET mode = %1  WHERE uid = %2 ').arg(mode).arg(userid);
    QSqlQuery query;
    if (!query.exec(queryStr))
    {
        qDebug() << '更新模式失败: ' << query.lastError().text();
    }
}
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();
        }
    }
}

数据库表设计

以下是数据库表设计,用于存储用户信息和智能家居设备状态:

用户表 (users)

| 列名 | 数据类型 | 说明 | |---|---|---| | uid | INTEGER | 用户ID,主键,自增 | | username | varchar(10) | 用户名 | | passwd | varchar(10) | 密码 |

智能家居状态表 (Status)

| 列名 | 数据类型 | 说明 | |---|---|---| | sid | INTEGER | 状态ID,主键,自增 | | uid | INTEGER | 用户ID,外键关联 users 表 | | device_name | varchar(10) | 设备名称 | | device_state | varchar(10) | 设备状态 | | value | varchar(10) | 设备状态值 | | mode | varchar(20) | 模式 |

代码功能说明

  • UsersWidget类:
    • 这是一个Qt窗口类,用于显示智能家居总览图,并提供用户交互功能。
    • 它包含了加载上一次状态、保存当前状态、更新模式等功能。
  • displayUsersWidget()函数:
    • 设置窗口标题和大小。
  • loadLastStatus()函数:
    • 从数据库加载上一次保存的模式,并更新界面上的模式选择框。
  • saveLastStatus()函数:
    • 将当前选择的模式保存到数据库。
  • on_mode_currentIndexChanged()函数:
    • 当用户切换模式时,更新所有智能设备的状态,并保存当前状态到数据库。
  • getLastState()函数:
    • 从数据库获取上一次保存的模式。
  • updateLastMode()函数:
    • 更新数据库中的模式信息。
  • closeEvent()函数:
    • 当用户关闭窗口时,弹出提示框,询问用户是否确认退出。

使用方法

  1. 创建一个UsersWidget类的实例,传入用户ID。
  2. 调用displayUsersWidget()函数显示窗口。
  3. 用户可以通过点击界面上的按钮控制智能设备,并切换模式。
  4. 当用户关闭窗口时,程序会自动保存当前状态。

总结

本文介绍了如何使用Qt设计智能家居系统的用户界面,并使用数据库和多线程技术实现用户状态保存、模式切换和设备控制等功能。该系统可以方便用户管理和控制家中的智能设备,提高生活质量。

注意:

  • 本文中的代码仅供参考,实际开发中需要根据具体需求进行修改。
  • 需要根据实际情况修改数据库连接信息和表名。
  • 需要实现updateSmartHomeStatus()函数,用于更新智能设备的状态。
Qt智能家居系统用户界面设计与实现 - 数据库与多线程

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

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