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数据库中设备状态信息,为开发者提供了一个简单易懂的示例。开发者可以根据自己的需求,扩展更多设备的控制逻辑,实现更加完善的智能家居系统。

Qt智能家居项目实战:使用QComboBox实现不同模式切换,并更新SQLite数据库

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

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