Qt智能家居:使用QComboBox和SQLite实现模式切换和数据更新

本文将介绍如何在Qt智能家居系统中使用QComboBox实现不同模式的切换,并实时更新SQLite数据库和界面数据。

1. 需求分析

用户需要在主界面 (UserWidget) 上选择不同的模式(例如睡眠模式、日常模式、节能模式),每个模式对应不同的设备状态和参数。选择模式后,系统需要将选择的模式和相应的设备状态保存到SQLite数据库中,并在其他界面 (例如Lights界面) 中实时更新数据。

2. 数据库设计

我们使用SQLite数据库来存储智能家居系统的状态信息。以下是Status表的结构:sql-- 创建智能家居状态表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));

  • sid: 状态记录的唯一ID,自动递增。* uid: 用户ID,关联到users表。* device_name: 设备名称,例如'智能灯'、'空调'等。* device_state: 设备状态,例如'开启'、'关闭'。* value: 设备参数值,例如亮度、温度等。* mode: 当前选择的模式,例如'睡眠模式'、'日常模式'等。

3. 代码实现

3.1 UserWidget类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 'QComboBox'#include 'QMessageBox'

UsersWidget::UsersWidget(int userid,QWidget *parent) : QWidget(parent), ui(new Ui::UsersWidget), userid(userid) // 保存用户ID{ ui->setupUi(this); displayUsersWidget();

// 连接各个设备按钮的信号和槽函数    connect(ui->lights, &QToolButton::clicked, this, [=]{        Lights *w = new Lights(userid);        w->show();});    // ... 其他设备按钮连接 ...

// 连接模式选择下拉框的信号和槽函数    connect(ui->mode, QOverload<const QString&>::of(&QComboBox::currentIndexChanged), this, [this](const QString& mode){        on_modeComboBox_currentIndexChanged(mode);    });}

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

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

// 模式选择下拉框改变时的槽函数void UsersWidget::on_modeComboBox_currentIndexChanged(const QString &mode){ if (mode == '睡眠模式') { updateSmartHomeStatus(userid, '智能灯', '开启', '20', mode); updateSmartHomeStatus(userid, '空调', '开启', '27', mode); updateSmartHomeStatus(userid, '加湿器', '开启', '50', mode); updateSmartHomeStatus(userid, '窗帘', '开启', '100', mode); } else if (mode == '日常模式') { // ... 设置日常模式下的设备状态和参数 ... } else if (mode == '节能模式') { // ... 设置节能模式下的设备状态和参数 ... }}

// 关闭窗口时的处理函数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(); } }}

3.2 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) // 保存用户ID{ ui->setupUi(this); lightsWidget();

// 连接开关组件的信号和槽函数    connect(ui->SwitchStatus, &SwitchForm::statusChanged, this, &Lights::switchButton_status);

// 连接完成按钮的信号和槽函数    connect(ui->Finished, &QPushButton::clicked, this, [=]{        if(ui->SwitchStatus->checked())        {            QString brightness = QString::number(ui->ctrlform->getValue());            updateSmartHomeStatus(userid, '智能灯', '开启', brightness, getCurrentMode(userid));        } else {            updateSmartHomeStatus(userid, '智能灯', '关闭', '0', getCurrentMode(userid));        }    });

// 加载上次更改的状态    loadLastStatus();}

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

void Lights::lightsWidget(){ setWindowTitle('智能灯设置'); // ... 设置界面背景等 ...}

bool Lights::switchButton_status(bool 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(userid); QString brightness = getLastBrightness(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 brightness = QString::number(ui->ctrlform->getValue()); updateLastBrightness(userid, brightness);

// 如果界面上显示关闭状态,但存入数据库的设备状态为开启,则更新数据库中的状态为关闭    if (!ui->SwitchStatus->checked()) {        updateSmartHomeStatus(userid, '智能灯', '关闭', '0', getCurrentMode(userid));    }}

// 获取上次的亮度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 { return ''; }}

// 更新上次的亮度void Lights::updateLastBrightness(int userid, QString brightness){ Sqlite::sqlite_init(); QString queryStr = QString('UPDATE Status SET value = %1 WHERE uid = %2 AND device_name = '智能灯'').arg(brightness).arg(userid); QSqlQuery query; query.exec(queryStr);}

// 获取上次的状态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 { return ''; }}

// 获取当前选择的模式QString Lights::getCurrentMode(int userid){ Sqlite::sqlite_init(); QString queryStr = QString('SELECT mode FROM Status WHERE uid = %1 ORDER BY sid DESC LIMIT 1').arg(userid); QSqlQuery query; if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { return '';

Qt智能家居:使用QComboBox和SQLite实现模式切换和数据更新

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

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