Qt智能家居项目实战:使用QComboBox实现不同模式切换,并更新SQLite数据库
Qt智能家居项目实战:使用QComboBox实现不同模式切换,并更新SQLite数据库
本文将介绍如何在Qt项目中使用QComboBox控件实现用户对智能家居不同模式的选择,例如睡眠模式、日常模式和节能模式,并在用户选择模式后,实时更新SQLite数据库中设备状态信息。
1. 用户界面设计
在Qt Designer中创建一个名为UsersWidget的QWidget界面,添加以下控件:
- QComboBox:用于选择模式,添加'睡眠模式'、'日常模式'、'节能模式'三个选项。
- 其他控件:根据需要添加灯光、空调、窗帘、加湿器等设备的控制按钮。
2. 代码实现
2.1 UsersWidget.h
#ifndef USERSWIDGET_H
#define USERSWIDGET_H
#include <QWidget>
#include <QComboBox>
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();
protected:
void closeEvent(QCloseEvent *event) override;
};
#endif // USERSWIDGET_H
2.2 UsersWidget.cpp
#include 'userswidget.h'
#include 'ui_userswidget.h'
#include 'sqlite.h'
// ...其他头文件
UsersWidget::UsersWidget(int userid, QWidget *parent) :
QWidget(parent),
ui(new Ui::UsersWidget),
userid(userid) // 初始化userid
{
ui->setupUi(this);
displayUsersWidget();
// 连接信号和槽,根据需要添加其他设备的控制逻辑
connect(ui->lights, &QToolButton::clicked, this, [=]{
Lights *w = new Lights(userid);
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 = QMessageBox::information(this, '提示', '确认退出智能管家系统?', QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
e->accept();
} else {
e->ignore();
}
}
}
2.3 sqlite.h
#ifndef SQLITE_H
#define SQLITE_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
class Sqlite : public QObject
{
Q_OBJECT
public:
Sqlite(QObject *parent = nullptr);
void sqlite_init();
void updateSmartHomeStatus(int userId, QString deviceName, QString devicestate, QString newValue);
bool statusUid(int userId);
};
#endif // SQLITE_H
2.4 sqlite.cpp
#include 'sqlite.h'
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
Sqlite::Sqlite(QObject *parent) : QObject(parent)
{
}
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('INSERT INTO Status (uid, device_name, device_state, value) VALUES (:userId, :deviceName, :devicestate, :newValue)');
query.bindValue(':userId', userId);
query.bindValue(':deviceName', deviceName);
query.bindValue(':devicestate', devicestate);
query.bindValue(':newValue', newValue);
if (!query.exec()) {
qDebug() << '插入数据失败:' << query.lastError().text();
}
}
bool Sqlite::statusUid(int userId)
{
sqlite_init();
QSqlQuery query;
query.prepare('SELECT * FROM status WHERE user_id = :userId');
query.bindValue(':userId', userId);
if (!query.exec()) {
qDebug() << '查询用户ID失败:' << query.lastError().text();
return false;
}
return query.next();
}
3. 数据库设计
在SQLite数据库中创建一个名为Status的表,用于存储智能家居设备的状态信息,表结构如下:
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)
);
4. 代码解析
UsersWidget类中,on_modeComboBox_currentIndexChanged槽函数会在用户选择不同的模式时触发,根据选择的模式更新数据库中对应设备的状态信息。Sqlite类中,updateSmartHomeStatus函数用于更新数据库中设备的状态信息,statusUid函数用于查询用户ID是否存在于数据库中。
5. 总结
本文介绍了如何在Qt项目中使用QComboBox控件实现智能家居不同模式的切换,并实时更新SQLite数据库中设备状态信息,为开发者提供了一个简单易懂的示例。开发者可以根据自己的需求,扩展更多设备的控制逻辑,实现更加完善的智能家居系统。
原文地址: https://www.cveoy.top/t/topic/fA9g 著作权归作者所有。请勿转载和采集!