Qt实现跨界面数据同步:UserWidget和Lights界面

本文将介绍如何使用Qt和SQLite数据库,解决UserWidget界面和Lights界面数据同步的问题。

问题描述

用户在UserWidget界面点击QComboBox选择模式后,SQLite数据库中的Status表内数据会发生改变。要求在点击Lights界面时,数据能够同步更新。

代码实现

1. userswidget.cpp

on_modeComboBox_currentIndexChanged函数中添加代码:

void UsersWidget::on_modeComboBox_currentIndexChanged(const QString &mode)
{
    if (mode == '睡眠模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '20');
        updateSmartHomeStatus(userid, '空调', '开启', '27');
        updateSmartHomeStatus(userid, '加湿器', '开启', '50');
        updateSmartHomeStatus(userid, '窗帘', '开启', '100');
        emit modeChanged(); // 发送信号,通知Lights界面更新数据
    } else if (mode == '日常模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '80');
        updateSmartHomeStatus(userid, '空调', '开启', '25');
        updateSmartHomeStatus(userid, '加湿器', '开启', '60');
        updateSmartHomeStatus(userid, '窗帘', '开启', '50');
        emit modeChanged(); // 发送信号,通知Lights界面更新数据
    } else if (mode == '节能模式') {
        updateSmartHomeStatus(userid, '智能灯', '开启', '50');
        updateSmartHomeStatus(userid, '空调', '开启', '26');
        updateSmartHomeStatus(userid, '加湿器', '开启', '40');
        updateSmartHomeStatus(userid, '窗帘', '开启', '30');
        emit modeChanged(); // 发送信号,通知Lights界面更新数据
    }
}

2. userswidget.h

添加信号声明:

signals:
    void modeChanged();

3. lights.h

添加槽函数声明:

private slots:
    void updateStatus(); // 更新状态的槽函数

4. lights.cpp

实现槽函数和连接信号槽:

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

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

    // 连接UsersWidget的modeChanged信号和Lights的updateStatus槽函数
    connect(parentWidget(), &UsersWidget::modeChanged, this, &Lights::updateStatus);
}

void Lights::updateStatus()
{
    // 加载最新的状态
    loadLastStatus();
}

工作原理

  1. 当用户在UserWidget界面选择模式后,on_modeComboBox_currentIndexChanged函数会被触发,更新数据库并发出modeChanged信号。
  2. Lights界面接收到modeChanged信号后,会调用updateStatus槽函数。
  3. updateStatus函数会重新加载数据库中的最新数据,从而实现数据同步更新。

通过以上步骤,即可实现UserWidget界面和Lights界面之间的数据同步,提升用户体验。

总结

本文介绍了如何使用Qt的信号槽机制和SQLite数据库实现跨界面数据同步。这种方法简单易懂,方便快捷,能够有效解决类似问题。

关键词

Qt, 数据同步, 跨界面, UserWidget, Lights, SQLite, 智能家居

Qt实现跨界面数据同步:UserWidget和Lights界面

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

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