使用Qt和SQLite构建智能家居系统:用户界面与数据库交互
#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();
}
}
}
创建用户表
CREATE TABLE IF NOT EXISTS users (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
username varchar(10),
passwd varchar(10)
);
创建智能家居状态表
CREATE TABLE IF NOT EXISTS Status (
sid INTEGER PRIMARY KEY AUTOINCREMENT,
uid INTEGER ,
device_name varchar(10),
device_state varchar(10),
value varchar(10),
mode varchar(20),
FOREIGN KEY (uid) REFERENCES users (uid)
);
这段代码演示了如何使用Qt和SQLite创建一个简单的智能家居系统用户界面。它涵盖了以下几个方面:
- 数据库创建: 使用SQLite创建了两个表:
users存储用户信息,Status存储智能家居设备的状态信息。 - 用户界面设计: 使用Qt Designer设计了一个用户友好的界面,包含了控制各种智能家居设备的按钮和显示设备状态的组件。
- 数据加载: 在程序启动时,从数据库中加载最新的设备状态信息并显示在界面上。
- 用户交互: 通过点击按钮或下拉框,用户可以控制智能家居设备的状态,并将最新的状态信息保存到数据库中。
这段代码为构建一个功能更强大的智能家居系统提供了一个基础框架,你可以根据自己的需求扩展功能,例如添加更多类型的设备、实现远程控制、数据可视化等等。
原文地址: https://www.cveoy.top/t/topic/fCZH 著作权归作者所有。请勿转载和采集!