Qt实现智能灯界面:状态保存与更新

本文将介绍如何使用Qt创建一个简单的智能灯控制界面,并实现以下功能:

  1. 状态保存: 用户关闭界面后,再次打开时能恢复到之前的状态,包括灯的开关状态和亮度值。2. 状态更新: 用户修改灯的开关状态或亮度值后,将最新的状态保存到数据库。

代码实现

1. Lights 类

Lights 类是智能灯控制界面的核心类,负责处理用户的操作、更新界面和与数据库交互。cpp#include 'lights.h'#include 'ui_lights.h'#include 'switchform.h'#include 'sqlite.h'#include #include #include #include #include

Lights::Lights(int userid,QWidget *parent) : QWidget(parent), ui(new Ui::Lights), userid(userid){ ui->setupUi(this); lightsWidget(); //连接开关组件的信号和自定义的槽函数 connect(ui->SwitchStatus,&SwitchForm::statusChanged,this,&Lights::switchButton_status);

// 连接完成按钮的clicked信号和自定义的槽函数    connect(ui->Finished, &QPushButton::clicked, this,[=]{        if(flag)        {            QString brighteness = QString::number(ui->ctrlform->getValue());            qDebug()<<brighteness<<userid;            updateSmartHomeStatus(userid,QString('智能灯'),QString('开启'),brighteness);        }else        {            qDebug()<<'智能灯未打开!';            updateSmartHomeStatus(userid,QString('智能灯'),QString('关闭'),QString('0'));        }    });    // 加载上次更改的状态    loadLastStatus();}

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

void Lights::lightsWidget(){ setWindowTitle('智能灯设置'); //设置ui组件背景 setAutoFillBackground(true); QPalette palette=this->palette(); QPixmap pixmap(':user/image/image/light.jpg'); palette.setBrush(QPalette::Window, QBrush(pixmap)); setPalette(palette); setFixedSize(600,400);}

bool Lights::switchButton_status(bool checked){ qDebug()<<checked; flag=checked; return flag;}

void Lights::showEvent(QShowEvent *event){ // 当页面显示时,加载上次更改的状态 loadLastStatus(); event->accept();}

void Lights::hideEvent(QHideEvent *event){ // 当页面隐藏时,保存当前更改的状态 saveLastStatus(); event->accept();}

void Lights::closeEvent(QCloseEvent *event){ // 隐藏窗口而不是关闭 hide(); event->ignore();}

void Lights::loadLastStatus(){ QString state = getLastState(this->userid); QString brightness = getLastBrightness(this->userid); if (state == '开启') { ui->SwitchStatus->setChecked(true); ui->ctrlform->setValue(brightness.toInt()); } else { ui->SwitchStatus->setChecked(false); ui->ctrlform->setValue(0); }}

void Lights::saveLastStatus(){ QString state = QString(flag); QString brightness = QString::number(ui->ctrlform->getValue()); updateLastBrightness(this->userid, state, brightness);}

QString Lights::getLastBrightness(int userid){ Sqlite::sqlite_init(); QString queryStr = QString('SELECT value FROM Status WHERE uid = %1 AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1').arg(userid); QSqlQuery query; if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { qDebug() << '获取上一次亮度错误: ' << query.lastError().text(); return ''; }}

void Lights::updateLastBrightness(int userid, QString state, QString brightness){ Sqlite::sqlite_init(); QString queryStr = QString('UPDATE Status SET value = %1, device_state = %2 WHERE uid = %3 AND device_name = '智能灯'').arg(brightness).arg(state).arg(userid); QSqlQuery query; if (!query.exec(queryStr)) { qDebug() << '更新亮度失败: ' << query.lastError().text(); }}

QString Lights::getLastState(int userid){ Sqlite::sqlite_init(); QString queryStr = QString('SELECT device_state FROM Status WHERE uid = %1 AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1').arg(userid); QSqlQuery query; if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { qDebug() << '获取上一次状态错误: ' << query.lastError().text(); return ''; }}

2. 数据库操作

使用 SQLite 数据库保存智能灯的状态,包括用户ID (uid)、设备名称 (device_name)、设备状态 (device_state)、亮度值 (value) 等信息。sql-- 创建用户表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(10), FOREIGN KEY (uid) REFERENCES users (uid));

代码解析

  1. showEvent() 函数: 当界面显示时,调用 loadLastStatus() 函数从数据库加载上次保存的状态,并更新界面上的开关状态和亮度值。2. hideEvent() 函数: 当界面隐藏时,调用 saveLastStatus() 函数将当前的开关状态和亮度值保存到数据库。3. closeEvent() 函数: 拦截窗口关闭事件,将其转换为隐藏窗口,防止数据丢失。4. loadLastStatus() 函数: 从数据库读取指定用户的智能灯状态,并更新界面。5. saveLastStatus() 函数: 将当前智能灯状态保存到数据库。6. getLastBrightness() 函数: 从数据库读取上次保存的亮度值。7. updateLastBrightness() 函数: 更新数据库中的亮度值。8. getLastState() 函数: 从数据库读取上次保存的开关状态。

总结

本文介绍了如何使用 Qt 实现一个简单的智能灯控制界面,并实现了状态保存和更新功能。通过合理地使用 Qt 的信号与槽机制、数据库操作和界面更新,可以轻松地开发出功能完善、用户体验良好的智能家居应用。

Qt实现智能灯界面:状态保存与更新

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

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