"// main.cpp\n#include \n#include "mainwindow.h"\n\nint main(int argc, char *argv[]) {\n QApplication a(argc, argv);\n MainWindow w;\n w.show();\n return a.exec();\n}"\n"// mainwindow.h\n#ifndef MAINWINDOW_H\n#define MAINWINDOW_H\n\n#include \n#include <QtCharts/QChartView>\n#include <QtCharts/QLineSeries>\n#include <QtCharts/QValueAxis>\n#include \n#include \n#include \n#include \n#include \n\nQT_CHARTS_USE_NAMESPACE\n\nclass MainWindow : public QMainWindow {\n Q_OBJECT\n\npublic:\n MainWindow(QWidget *parent = nullptr);\n ~MainWindow();\n\nprivate slots:\n void toggleLight(bool checked);\n void setLightBrightness(int value);\n void toggleAC(bool checked);\n void monitorTemperature();\n void toggleHumidifier(bool checked);\n void monitorHumidity();\n void toggleCurtain(bool checked);\n void setCurtainHeight(int value);\n void switchMode();\n void login();\n\nprivate:\n void setupUI();\n void setupChart();\n void addToChart(QChart *chart, QLineSeries *series, QString name);\n\n QLineEdit *usernameEdit;\n QLineEdit *passwordEdit;\n QPushButton *loginButton;\n QPushButton *logoutButton;\n QLabel *statusLabel;\n\n QCheckBox *lightCheckbox;\n QSlider *brightnessSlider;\n\n QCheckBox *acCheckbox;\n QLabel *temperatureLabel;\n\n QCheckBox *humidifierCheckbox;\n QLabel *humidityLabel;\n\n QCheckBox *curtainCheckbox;\n QSlider *heightSlider;\n\n QComboBox *modeComboBox;\n\n QChartView *chartView;\n QLineSeries *temperatureSeries;\n QLineSeries *humiditySeries;\n};\n\n#endif // MAINWINDOW_H"\n"// mainwindow.cpp\n#include "mainwindow.h"\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n\nMainWindow::MainWindow(QWidget *parent)\n : QMainWindow(parent) {\n setupUI();\n setupChart();\n // 连接数据库并创建表\n QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");\n db.setDatabaseName("smart_home.db");\n if (!db.open()) {\n qDebug() << "Failed to open database";\n } else {\n QSqlQuery query;\n query.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT)");\n query.exec("CREATE TABLE IF NOT EXISTS home_status (id INTEGER PRIMARY KEY AUTOINCREMENT, temperature REAL, humidity REAL, timestamp TEXT)");\n }\n}\n\nMainWindow::~MainWindow() {\n QSqlDatabase::database().close();\n}\n\nvoid MainWindow::setupUI() {\n QWidget *centralWidget = new QWidget(this);\n setCentralWidget(centralWidget);\n\n QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);\n\n // 登录部分\n QGroupBox *loginGroup = new QGroupBox("登录");\n QVBoxLayout *loginLayout = new QVBoxLayout(loginGroup);\n usernameEdit = new QLineEdit();\n passwordEdit = new QLineEdit();\n passwordEdit->setEchoMode(QLineEdit::Password);\n loginButton = new QPushButton("登录");\n logoutButton = new QPushButton("退出登录");\n statusLabel = new QLabel();\n statusLabel->setAlignment(Qt::AlignCenter);\n loginLayout->addWidget(usernameEdit);\n loginLayout->addWidget(passwordEdit);\n loginLayout->addWidget(loginButton);\n loginLayout->addWidget(logoutButton);\n loginLayout->addWidget(statusLabel);\n mainLayout->addWidget(loginGroup);\n\n // 智能灯部分\n QGroupBox *lightGroup = new QGroupBox("智能灯");\n QHBoxLayout *lightLayout = new QHBoxLayout(lightGroup);\n lightCheckbox = new QCheckBox("开关");\n brightnessSlider = new QSlider(Qt::Horizontal);\n brightnessSlider->setRange(0, 100);\n lightLayout->addWidget(lightCheckbox);\n lightLayout->addWidget(brightnessSlider);\n mainLayout->addWidget(lightGroup);\n\n // 空调部分\n QGroupBox *acGroup = new QGroupBox("空调");\n QHBoxLayout *acLayout = new QHBoxLayout(acGroup);\n acCheckbox = new QCheckBox("开关");\n temperatureLabel = new QLabel("温度: 0°C");\n acLayout->addWidget(acCheckbox);\n acLayout->addWidget(temperatureLabel);\n mainLayout->addWidget(acGroup);\n\n // 加湿器部分\n QGroupBox *humidifierGroup = new QGroupBox("加湿器");\n QHBoxLayout *humidifierLayout = new QHBoxLayout(humidifierGroup);\n humidifierCheckbox = new QCheckBox("开关");\n humidityLabel = new QLabel("湿度: 0%");\n humidifierLayout->addWidget(humidifierCheckbox);\n humidifierLayout->addWidget(humidityLabel);\n mainLayout->addWidget(humidifierGroup);\n\n // 窗帘部分\n QGroupBox *curtainGroup = new QGroupBox("窗帘");\n QHBoxLayout *curtainLayout = new QHBoxLayout(curtainGroup);\n curtainCheckbox = new QCheckBox("开关");\n heightSlider = new QSlider(Qt::Horizontal);\n heightSlider->setRange(0, 100);\n curtainLayout->addWidget(curtainCheckbox);\n curtainLayout->addWidget(heightSlider);\n mainLayout->addWidget(curtainGroup);\n\n // 模式切换部分\n QGroupBox *modeGroup = new QGroupBox("模式切换");\n QHBoxLayout *modeLayout = new QHBoxLayout(modeGroup);\n modeComboBox = new QComboBox();\n modeComboBox->addItem("睡眠模式");\n modeComboBox->addItem("节能模式");\n modeComboBox->addItem("日常模式");\n modeLayout->addWidget(modeComboBox);\n mainLayout->addWidget(modeGroup);\n\n // 图表部分\n mainLayout->addWidget(chartView);\n\n // 信号槽连接\n connect(loginButton, &QPushButton::clicked, this, &MainWindow::login);\n connect(logoutButton, &QPushButton::clicked, this {\n statusLabel->setText("");\n });\n connect(lightCheckbox, &QCheckBox::toggled, this, &MainWindow::toggleLight);\n connect(brightnessSlider, &QSlider::valueChanged, this, &MainWindow::setLightBrightness);\n connect(acCheckbox, &QCheckBox::toggled, this, &MainWindow::toggleAC);\n connect(humidifierCheckbox, &QCheckBox::toggled, this, &MainWindow::toggleHumidifier);\n connect(curtainCheckbox, &QCheckBox::toggled, this, &MainWindow::toggleCurtain);\n connect(heightSlider, &QSlider::valueChanged, this, &MainWindow::setCurtainHeight);\n connect(modeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &MainWindow::switchMode);\n\n QTimer *timer = new QTimer(this);\n connect(timer, &QTimer::timeout, this, &MainWindow::monitorTemperature);\n timer->start(60000);\n}\n\nvoid MainWindow::setupChart() {\n QChart *chart = new QChart();\n chart->setTitle("温度和湿度变化");\n\n temperatureSeries = new QLineSeries();\n temperatureSeries->setName("温度");\n humiditySeries = new QLineSeries();\n humiditySeries->setName("湿度");\n\n QDateTimeAxis *axisX = new QDateTimeAxis();\n axisX->setTickCount(10);\n axisX->setFormat("hh:mm");\n axisX->setTitleText("时间");\n\n QValueAxis *axisY = new QValueAxis();\n axisY->setLabelFormat("%.1f");\n axisY->setTitleText("数值");\n\n chart->addSeries(temperatureSeries);\n chart->addSeries(humiditySeries);\n chart->addAxis(axisX, Qt::AlignBottom);\n chart->addAxis(axisY, Qt::AlignLeft);\n temperatureSeries->attachAxis(axisX);\n temperatureSeries->attachAxis(axisY);\n humiditySeries->attachAxis(axisX);\n humiditySeries->attachAxis(axisY);\n\n chartView = new QChartView(chart);\n chartView->setRenderHint(QPainter::Antialiasing);\n chartView->setMinimumHeight(300);\n chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\n}\n\nvoid MainWindow::addToChart(QChart *chart, QLineSeries *series, QString name) {\n if (chart->series().contains(series)) {\n chart->removeSeries(series);\n }\n series->clear();\n QSqlQuery query;\n query.exec(QString("SELECT temperature, humidity, timestamp FROM home_status ORDER BY id DESC LIMIT 10"));\n while (query.next()) {\n qreal temperature = query.value(0).toDouble();\n qreal humidity = query.value(1).toDouble();\n QString timestamp = query.value(2).toString();\n QDateTime datetime = QDateTime::fromString(timestamp, "yyyy-MM-dd hh:mm:ss");\n series->append(datetime.toMSecsSinceEpoch(), temperature);\n }\n chart->addSeries(series);\n}\n\nvoid MainWindow::toggleLight(bool checked) {\n // 发送控制智能灯的命令\n}\n\nvoid MainWindow::setLightBrightness(int value) {\n // 发送设置智能灯亮度的命令\n}\n\nvoid MainWindow::toggleAC(bool checked) {\n // 发送控制空调的命令\n}\n\nvoid MainWindow::monitorTemperature() {\n qreal temperature = 0; // 获取当前温度\n temperatureLabel->setText(QString("温度: %1°C").arg(temperature));\n\n // 将温度存储到数据库\n QSqlQuery query;\n query.exec(QString("INSERT INTO home_status (temperature, humidity, timestamp) VALUES (%1, 0, '%2')").arg(temperature).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")));\n\n addToChart(chartView->chart(), temperatureSeries, "温度");\n}\n\nvoid MainWindow::toggleHumidifier(bool checked) {\n // 发送控制加湿器的命令\n}\n\nvoid MainWindow::monitorHumidity() {\n qreal humidity = 0; // 获取当前湿度\n humidityLabel->setText(QString("湿度: %1%").arg(humidity));\n\n // 将湿度存储到数据库\n QSqlQuery query;\n query.exec(QString("INSERT INTO home_status (temperature, humidity, timestamp) VALUES (0, %1, '%2')").arg(humidity).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")));\n\n addToChart(chartView->chart(), humiditySeries, "湿度");\n}\n\nvoid MainWindow::toggleCurtain(bool checked) {\n // 发送控制窗帘的命令\n}\n\nvoid MainWindow::setCurtainHeight(int value) {\n // 发送设置窗帘高度的命令\n}\n\nvoid MainWindow::switchMode() {\n int index = modeComboBox->currentIndex();\n // 根据选择的模式发送相应的命令\n}\n\nvoid MainWindow::login() {\n QString username = usernameEdit->text();\n QString password = passwordEdit->text();\n\n // 查询数据库验证用户名和密码\n QSqlQuery query;\n query.exec(QString("SELECT * FROM users WHERE username='%1' AND password='%2'").arg(username).arg(password));\n if (query.next()) {\n statusLabel->setText("登录成功");\n } else {\n statusLabel->setText("登录失败");\n }\n}"\n"// server.c\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <sys/socket.h>\n#include <arpa/inet.h>\n#include <sqlite3.h>\n\n#define PORT 8080\n\nsqlite3 *db;\n\nint callback(void *data, int argc, char **argv, char **azColName) {\n return 0;\n}\n\nint main(int argc, char *argv[]) {\n int server_fd, new_socket, valread;\n struct sockaddr_in address;\n int opt = 1;\n int addrlen = sizeof(address);\n char buffer[1024] = {0};\n char *hello = "Hello from server";\n\n // 打开数据库\n if (sqlite3_open("smart_home.db", &db)) {\n fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));\n return 1;\n }\n\n // 创建服务器套接字\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // 设置套接字选项\n if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {\n perror("setsockopt failed");\n exit(EXIT_FAILURE);\n }\n address.sin_family = AF_INET;\n address.sin_addr.s_addr = INADDR_ANY;\n address.sin_port = htons(PORT);\n\n // 绑定套接字到指定的IP和端口\n if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {\n perror("bind failed");\n exit(EXIT_FAILURE);\n }\n\n // 监听连接\n if (listen(server_fd, 3) < 0) {\n perror("listen failed");\n exit(EXIT_FAILURE);\n }\n\n // 接受客户端连接\n if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {\n perror("accept failed");\n exit(EXIT_FAILURE);\n }\n\n // 接收客户端消息并发送回复\n valread = read(new_socket, buffer, 1024);\n printf("%s\n", buffer);\n send(new_socket, hello, strlen(hello), 0);\n printf("Hello message sent\n");\n\n // 存储客户端传输的信息到数据库\n char *sql = "INSERT INTO home_status (temperature, humidity, timestamp) VALUES (25.0, 50.0, '2022-01-01 00:00:00')";\n char *errMsg;\n if (sqlite3_exec(db, sql, callback, 0, &errMsg) != SQLITE_OK) {\n fprintf(stderr, "SQL error: %s\n", errMsg);\n sqlite3_free(errMsg);\n }\n\n return 0;\n}"\n

智能家居系统开发:基于Qt的C++客户端和C语言服务器

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

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