代码补充:要求用户在UserWidget界面点击QComboBox可以选择睡眠模式日常模式节能模式用户选择模式后SQlite的Status表内数据改变#include userswidgeth#include ui_userswidgeth#include sqliteh#include lightsh#include airconditionh#include curtainsh#include
这段代码存在一些问题,需要进行修改和补充。以下是修改后的代码:
userswidget.h:
#ifndef USERSWIDGET_H
#define USERSWIDGET_H
#include <QWidget>
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();
void closeEvent(QCloseEvent *e);
void updateSmartHomeStatus(int userId, QString deviceName, QString devicestate, QString newValue);
bool statusUid(int userId);
};
#endif // USERSWIDGET_H
userswidget.cpp:
#include "userswidget.h"
#include "ui_userswidget.h"
#include "sqlite.h"
#include "lights.h"
#include "aircondition.h"
#include "curtains.h"
#include "humidiffer.h"
#include "information.h"
#include "procession.h"
#include <QCloseEvent>
#include <QMessageBox>
UsersWidget::UsersWidget(int userid, QWidget *parent) :
QWidget(parent),
ui(new Ui::UsersWidget),
userid(userid)
{
ui->setupUi(this);
displayUsersWidget();
connect(ui->lights, &QToolButton::clicked, this, [=]{
Lights *w = new Lights(userid);
w->show();
});
connect(ui->air_condition, &QToolButton::clicked, this, [=]{
AirCondition *w = new AirCondition(userid);
w->show();
});
connect(ui->curtains, &QToolButton::clicked, this, [=]{
Curtains *w = new Curtains(userid);
w->show();
});
connect(ui->humidifiers, &QToolButton::clicked, this, [=]{
Humidiffer *w = new Humidiffer(userid);
w->show();
});
connect(ui->tables, &QToolButton::clicked, this, [=]{
Information *w = new Information;
w->show();
});
connect(ui->wifi, &QToolButton::clicked, this, [=]{
Procession *w = new Procession;
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;
reply = QMessageBox::information(this, "提示", "确认退出智能管家系统?", QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
//若用户点击确认,则接收这个事件,当前窗口会关闭
e->accept();
} else {
//若用户点击取消,则忽略这个事件,当前窗口不会关闭
e->ignore();
}
}
}
sqlite.cpp:
#include "sqlite.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
Sqlite::Sqlite()
{
}
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("SELECT * FROM Status WHERE uid = :userId");
query.bindValue(":userId", userId);
if (!query.exec()) {
qDebug() << "查询id失败:" << query.lastError().text();
}
QString sql = QString("INSERT INTO Status (uid, device_name, device_state, value) VALUES (%1, '%2', '%3', '%4')")
.arg(userId).arg(deviceName).arg(devicestate).arg(newValue);
query.prepare(sql);
if (!query.exec()) {
qDebug() << "插入数据失败:" << query.lastError().text();
return;
}
}
bool Sqlite::statusUid(int userId)
{
sqlite_init();
QSqlQuery query;
// 查询智能家居状态表,获取用户对应的状态
query.prepare("SELECT * FROM status WHERE user_id = :userId");
query.bindValue(":userId", userId);
qDebug() << query.exec();
if (!query.next()) {
qDebug() << "Failed to execute query!" << query.lastError().text();
return false;
} else {
qDebug() << "Successed to execute query!";
return true;
}
}
注意事项:
Sqlite类的成员函数需要在定义时加上类名作为前缀,以指明其所属类。Sqlite类的成员函数需要在实现文件中进行定义。Sqlite类的成员函数的定义需要加上Sqlite::作为前缀,以指明其所属类。- 在
updateSmartHomeStatus函数中,需要使用Sqlite::sqlite_init()进行数据库初始化,而不是直接调用sqlite_init()。 - 在
statusUid函数中,需要使用Sqlite::sqlite_init()进行数据库初始化,而不是直接调用sqlite_init()。
此外,还需要在主程序中包含userswidget.h和sqlite.h头文件,并创建UsersWidget对象进行使用
原文地址: https://www.cveoy.top/t/topic/izAn 著作权归作者所有。请勿转载和采集!