智能灯设置页面代码优化:保存和加载最新状态
#ifndef LIGHTS_H #define LIGHTS_H
#include
namespace Ui { class Lights; }
class Lights : public QWidget { Q_OBJECT
public: explicit Lights(int userid,QWidget *parent = nullptr); ~Lights(); void lightsWidget(); bool flag=false;
void showEvent(QShowEvent *event); // 重写界面
void hideEvent(QHideEvent *event); // 隐藏界面
void loadLastStatus(); // 加载上次更改的状态
void saveLastStatus(); // 保存当前更改的状态
public slots: bool switchButton_status(bool checked);
private: Ui::Lights *ui; int userid;
void closeEvent(QCloseEvent *event);
QString getLastBrightness(int userid);
QString getLastState(int userid);
void updateLastBrightness(int userid, QString state,QString brightness);
};
#endif // LIGHTS_H
#include 'switchform.h'
#include 'ui_switchform.h'
#include
SwitchForm::SwitchForm(QWidget *parent) : QWidget(parent) { m_space = 2; m_radius = 5; m_checked = false; m_showText = true; m_showText = false; m_animation = true;
m_bgColorOn = QColor(102, 205, 170);//设置按钮内部颜色
m_bgColorOff = QColor(190, 190, 190);
m_sliderColorOn = QColor(255, 255, 255);
m_sliderColorOff = QColor(255, 255, 255);
m_textColor = QColor(255, 255, 255);
m_textOn = '开启';//设置按钮中的文字
m_textOff = '关闭';
m_step = 0;
m_startX = 0;
m_endX = 0;
m_timer = new QTimer(this);
m_timer->setInterval(30);
connect(m_timer, SIGNAL(timeout()), this, SLOT(updateValue()));
}
void SwitchForm::drawBackGround(QPainter *painter) { painter->save(); painter->setPen(Qt::NoPen);
QColor bgColor = m_checked ? m_bgColorOn : m_bgColorOff;
if (isEnabled()) {
bgColor.setAlpha(150);
}
painter->setBrush(bgColor);
QRect rect(0, 0, width(), height());
int side = qMin(width(), height());
//左侧半圆
QPainterPath path1;
path1.addEllipse(rect.x(), rect.y(), side, side);
//右侧半圆
QPainterPath path2;
path2.addEllipse(rect.width() - side, rect.y(), side, side);
//中间的矩形
QPainterPath path3;
path3.addRect(rect.x() + side / 2, rect.y(), rect.width() - side, height());
QPainterPath path = path1 + path2 + path3;
painter->drawPath(path);
//绘制文本
//滑块半径
int sliderWidth = qMin(height(), width()) - m_space * 2 - 5;
if (m_checked){
QRect textRect(0, 0, width() - sliderWidth, height());
painter->setPen(QPen(m_textColor));
painter->drawText(textRect, Qt::AlignCenter, m_textOn);
} else {
QRect textRect(sliderWidth, 0, width() - sliderWidth, height());
painter->setPen(QPen(m_textColor));
painter->drawText(textRect, Qt::AlignCenter, m_textOff);
}
painter->restore();
}
void SwitchForm::drawSlider(QPainter *painter) { painter->save(); painter->setPen(Qt::NoPen);
QColor color = m_checked ? m_sliderColorOn : m_sliderColorOff;
painter->setBrush(QBrush(color));
int sliderWidth = qMin(width(), height()) - m_space * 2;
int sliderX = m_checked ? width() - sliderWidth - m_space : m_space; // 修改滑块的X轴坐标
QRect rect(sliderX, m_space, sliderWidth, sliderWidth);
painter->drawEllipse(rect);
painter->restore();
}
void SwitchForm::paintEvent(QPaintEvent *ev) { //启用反锯齿 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
//绘制背景
drawBackGround(&painter);
//绘制滑块
drawSlider(&painter);
}
void SwitchForm::mousePressEvent(QMouseEvent *ev) { Q_UNUSED(ev)
setChecked(!m_checked);
emit statusChanged(m_checked);
// 计算步长
m_step = qAbs(m_endX - m_startX) / 10; // 修改步长的计算方式
// 判断是否使用动画
if (m_animation) {
m_timer->start();
} else {
m_startX = m_endX;
update();
}
}
void SwitchForm::updateValue() { if (m_checked) { if (m_startX < m_endX) { m_startX += m_step; } else { m_startX = m_endX; m_timer->stop(); } } else { if (m_startX > m_endX) { m_startX -= m_step; } else { m_startX = m_endX; m_timer->stop(); } }
update();
}
int SwitchForm::space() const { return m_space; }
bool SwitchForm::checked() const { return m_checked; }
bool SwitchForm::showText() const { return m_showText; }
bool SwitchForm::showCircel() const { return m_showCircle; }
bool SwitchForm::animation() const { return m_animation; }
QColor SwitchForm::bgColorOn() const { return m_bgColorOn; }
QColor SwitchForm::bgColorOff() const { return m_bgColorOff; }
QColor SwitchForm::sliderColorOn() const { return m_sliderColorOn; }
QColor SwitchForm::sliderColorOff() const { return m_sliderColorOff; }
QColor SwitchForm::textColor() const { return m_textColor; }
QString SwitchForm::textOn() const { return m_textOn; }
QString SwitchForm::textOff() const { return m_textOff; }
int SwitchForm::step() const { return m_step; }
int SwitchForm::startX() const { return m_startX; }
int SwitchForm::endX() const { return m_endX; }
void SwitchForm::setSpace(int space) { if (m_space != space) { m_space = space; update(); } }
void SwitchForm::setRadius(int radius) { if (m_radius != radius) { m_radius = radius; update(); } }
void SwitchForm::setChecked(bool checked) { if (m_checked != checked) { m_checked = checked; update(); } }
void SwitchForm::setShowText(bool show) { if (m_showText != show) { m_showText = show; update(); } }
void SwitchForm::setShowCircle(bool show) { if (m_showCircle != show) { m_showCircle = show; update(); } }
void SwitchForm::setAnimation(bool ok) { if (m_animation != ok) { m_animation = ok; update(); } }
void SwitchForm::setBgColorOn(const QColor &color) { if (m_bgColorOn != color) { m_bgColorOn = color; update(); } }
void SwitchForm::setBgColorOff(const QColor &color) { if (m_bgColorOff != color) { m_bgColorOff = color; update(); } }
void SwitchForm::setSliderColorOn(const QColor &color) { if (m_sliderColorOn != color) { m_sliderColorOn = color; update(); } }
void SwitchForm::setSliderColorOff(const QColor &color) { if (m_sliderColorOff != color) { m_sliderColorOff = color; update(); } }
void SwitchForm::setTextColor(const QColor &color) { if (m_textColor != color) { m_textColor = color; update(); } }
void SwitchForm::setTextOn(const QString &text) { if (m_textOn != text) { m_textOn = text; update(); } }
void SwitchForm::setTextOff(const QString &text) { if (m_textOff != text) { m_textOff = text; update(); } }
bool SwitchForm::getstate() { return m_checked; }
#include 'lights.h'
#include 'ui_lights.h'
#include 'switchform.h'
#include 'sqlite.h'
#include
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(flag)
{
QString brighteness = QString::number(ui->ctrlform->getValue());
qDebug()<<brighteness<<userid;
updateSmartHomeStatus(userid,QString('智能灯'),QString('开启'),brighteness);
}else
{
qDebug()<<'智能灯未打开!';
updateSmartHomeStatus(userid,QString('智能灯'),QString('关闭'),QString('0'));
}
});
// 加载上次更改的状态
loadLastStatus();
}
Lights::~Lights() { delete ui; }
void Lights::lightsWidget() { setWindowTitle('智能灯设置'); //设置ui组件背景 setAutoFillBackground(true); QPalette palette=this->palette(); QPixmap pixmap(':/user/image/image/light.jpg'); palette.setBrush(QPalette::Window, QBrush(pixmap)); setPalette(palette); setFixedSize(600,400); }
bool Lights::switchButton_status(bool checked) { qDebug()<<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()
{
qDebug()<
void Lights::saveLastStatus()
{
qDebug()<
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); qDebug()<<queryStr<<userid; QSqlQuery query; qDebug ()<<query.exec(queryStr); if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { qDebug() << '得到上一次亮度错误: ' << query.lastError().text(); return ''; } }
void Lights::updateLastBrightness(int userid,QString state,QString brightness) { Sqlite::sqlite_init(); QString queryStr = QString('INSERT INTO Status (uid, device_name, device_state, value) VALUES (%1, '智能灯', '%2', %3)').arg(userid).arg(state).arg(brightness); QSqlQuery query; if (!query.exec(queryStr)) { qDebug() << '更新亮度失败: ' << query.lastError().text(); } }
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); qDebug()<<queryStr<<userid; QSqlQuery query; qDebug ()<<query.exec(queryStr); if (query.exec(queryStr) && query.next()) { return query.value(0).toString(); } else { qDebug() << '得到上一次状态错误: ' << query.lastError().text(); return ''; } }
-- 创建用户表 CREATE TABLE IF NOT EXISTS users ( uid INTEGER PRIMARY KEY AUTOINCREMENT, username varchar(10), passwd varchar(10) );
-- 创建智能家居状态表 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) );
SELECT device_state FROM Status WHERE uid = 123 AND device_name = '智能灯'; SELECT device_state FROM Status WHERE uid = 123 AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1 内容:代码修改部分如下:
在Lights类中的saveLastStatus()函数中,将状态和亮度存入数据库中:
void Lights::saveLastStatus()
{
QString state = flag ? '开启' : '关闭';
QString brightness = QString::number(ui->ctrlform->getValue());
updateLastBrightness(this->userid, state, brightness);
}
void Lights::updateLastBrightness(int userid, QString state, QString brightness)
{
Sqlite::sqlite_init();
QString queryStr = QString('INSERT INTO Status (uid, device_name, device_state, value) VALUES (%1, '智能灯', '%2', %3)').arg(userid).arg(state).arg(brightness);
QSqlQuery query;
if (!query.exec(queryStr))
{
qDebug() << '更新亮度失败: ' << query.lastError().text();
}
}
在Lights类中的loadLastStatus()函数中,从数据库中获取最新的状态和亮度:
void Lights::loadLastStatus()
{
QString state = getLastState(this->userid);
QString brightness = getLastBrightness(this->userid);
if (state == '开启')
{
ui->SwitchStatus->setChecked(true);
ui->ctrlform->setValue(brightness.toInt());
}
else
{
ui->SwitchStatus->setChecked(false);
ui->ctrlform->setValue(0);
}
}
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
{
qDebug() << '得到上一次亮度错误: ' << query.lastError().text();
return '';
}
}
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
{
qDebug() << '得到上一次状态错误: ' << query.lastError().text();
return '';
}
}
此外,还需要在Lights类的头文件中添加以下函数声明:
QString getLastBrightness(int userid);
QString getLastState(int userid);
void updateLastBrightness(int userid, QString state, QString brightness);
以及在SwitchForm类的头文件中添加以下函数声明:
bool getstate();
在SwitchForm类的cpp文件中添加以下函数实现:
bool SwitchForm::getstate()
{
return m_checked;
}
以上是根据问题描述进行的代码修改,可能还有其他未提及的问题需要解决。请根据实际需求进行相应的修改和调试。
原文地址: https://www.cveoy.top/t/topic/fAXT 著作权归作者所有。请勿转载和采集!