#include 'aircondition.h' #include 'ui_aircondition.h' #include 'switchform.h' #include 'lcdform.h' #include 'sqlite.h' #include #include #include #include #include #include

AirCondition::AirCondition(int userid, QWidget *parent) : QWidget(parent), ui(new Ui::AirCondition), userid(userid), m_loadLastStatus(true), m_connectionsEstablished(false) { ui->setupUi(this); airConditionWidget(); m_updateTimer = new QTimer(this); m_updateTimer->setInterval(500); // 设置定时器间隔为0.5秒 connect(m_updateTimer, &QTimer::timeout, this, &AirCondition::updateDatabase); // 加载上次更改的状态 loadLastStatus(); }

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

void AirCondition::airConditionWidget() { setWindowTitle('空调设置'); // 设置ui组件背景 setAutoFillBackground(true); QPalette palette = this->palette(); QPixmap pixmap(':/user/image/image/aircondition.jpg'); palette.setBrush(QPalette::Window, QBrush(pixmap)); setPalette(palette); setFixedSize(600, 400); }

void AirCondition::switchButton_status() { // 判断是否是用户操作 if (QObject::sender() == ui->SwitchStatus) { // 更新状态到数据库 if (ui->SwitchStatus->checked()) {

        ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')->setEnabled(true);
        ui->temperature->setValue(lasttemp.toDouble());

    } else {
        lasttemp = getLastTemperature(this->userid);
        ui->temperature->setValue(0);
        ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')->setEnabled(false);
    }
    // 重启定时器
    m_updateTimer->start();
}

}

void AirCondition::temperature_changed() { // 判断是否是用户操作 if (QObject::sender() == ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')) { // 重启定时器 m_updateTimer->start(); } }

void AirCondition::loadLastStatus() { if (!m_loadLastStatus) { // 判断是否加载上一次的信息 return; }

QString state = getLastState(this->userid);
QString temp = getLastTemperature(this->userid);

if (state == '开启') {
    ui->SwitchStatus->setChecked(true);
    ui->temperature->setValue(temp.toDouble());
} else {
    ui->SwitchStatus->setChecked(false);
    ui->temperature->setValue(0);
    ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox')->setEnabled(false);
}

m_loadLastStatus = false; // 加载完毕后将标志位设置为false,避免重复加载
if (m_connectionsEstablished) {
    return; // 如果信号槽连接已建立,则直接返回
}

// 建立信号槽连接
connect(ui->SwitchStatus, &SwitchForm::statusChanged, this, &AirCondition::switchButton_status);
connect(ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox'), QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &AirCondition::temperature_changed);
connect(ui->temperature->findChild<QDoubleSpinBox*>('doubleSpinBox'), QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &AirCondition::startUpdateTimer);

// 如果开启按钮的状态是关闭的,则将温度值设置为0
if (!ui->SwitchStatus->checked()) {
    ui->temperature->setValue(0);
}

m_connectionsEstablished = true; // 设置标志位为true,表示信号槽连接已建立

}

QString AirCondition::getLastTemperature(int userid) { 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 ''; } }

QString AirCondition::getLastState(int userid) { 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 ''; } }

void AirCondition::startUpdateTimer() { m_updateTimer->start(); // 启动定时器 }

void AirCondition::updateDatabase() { // 更新状态到数据库 QString temp = ui->SwitchStatus->checked() ? QString::number(ui->temperature->getValue()) : '0'; updateSmartHomeStatus(userid, QString('空调'), ui->SwitchStatus->checked() ? QString('开启') : QString('关闭'), temp);

m_updateTimer->stop(); // 停止定时器

}

void AirCondition::closeEvent(QCloseEvent *event) { event->ignore(); // 忽略关闭事件 hide(); // 隐藏界面

// 保存开启按钮的状态到数据库
QString state = ui->SwitchStatus->checked() ? '开启' : '关闭';
updateSmartHomeStatus(userid, '空调', state, '0');

}

// 问题分析: // 关闭按钮和开启按钮的状态是通过数据库中的状态来控制的。 // 当关闭按钮关闭后,温度值会被设置为0,并且在关闭界面时会保存到数据库中。 // 因此,当重新进入界面并点击开启按钮时,温度值会被设置为0。 // 解决方法:在关闭界面时不保存温度值到数据库中,只保存开启按钮的状态。 // 这样,在重新进入界面时,可以根据数据库中的状态来设置开启按钮的状态,而温度值不会被重置为0。 // 修改代码:在 closeEvent 函数中,将保存温度值的代码注释掉或移除,只保留保存开启按钮状态的代码。 // 在重新进入界面时,需要重新加载上次的状态和温度值,以确保界面显示正确的状态。

空调设置组件 - Qt 开发指南

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

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