#include "widget.h"
#include "ui_widget.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include <QBuffer>
#include <QSqlRecord>
#include <QUrlQuery> // 引入URL查询类,用于构建URL的查询参数
#include <QRandomGenerator> //随机数
#include <QDateTime> //获取时间
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
form = new Form;
speeker = new QTextToSpeech; // 创建一个文本转语音对象
//数据库
qDebug()<<"drivers:"<<QSqlDatabase::drivers();
if(QSqlDatabase::contains("qt_sql_default_connnection")){
db = QSqlDatabase::database("qt_sql_default_connection"); //如果存在,获取该连接
}else{
db = QSqlDatabase::addDatabase("QSQLITE");
}
db.setDatabaseName("my.db"); // 设置数据库文件名
if(db.isOpen()){
return; // 如果已打开,直接返回
}else {
if(!db.open()){
qDebug()<<"open:"<<db.lastError().text();
return; // 打开失败,返回
}
}
qDebug()<<"数据库打开成功";
QString sql = "create table if not exists packing_t(packing int,license text,duration int,cost int,start string);";
QSqlQuery query(sql); // 创建QSqlQuery对象用于执行SQL语句
if(!query.exec()){ // 执行SQL语句创建表
qDebug()<<"create:"<<query.lastError().text();
}
//车牌识别
httphelper = new QNetworkAccessManager;
httpmanager = new QNetworkAccessManager;
httpmanager_li = new QNetworkAccessManager;
connect(httphelper, &QNetworkAccessManager::finished,this, &Widget::onNetworkReplyFinished);
connect(httpmanager, &QNetworkAccessManager::finished,this, &Widget::read_ack);
connect(httpmanager_li, &QNetworkAccessManager::finished,this, &Widget::li_ack);
connect(form, QOverload<>::of(&Form::backForm), this, &Widget::show);
connect(this, &Widget::dashboard_value, form, &Form::countItemsInPackingT);
}
Widget::~Widget()
{
delete ui;
delete speeker; // 释放内存
}
void Widget::onNetworkReplyFinished(QNetworkReply *reply)
{
while(reply->canReadLine())
{
QByteArray buf = reply->readLine();
qDebug()<<buf;
// 示例响应数据格式,用于参考:{"model":"deepseek-r1:7b","created_at":"2025-02-06T04:05:03.7173837Z","message":{"role":"assistant","content":"\u003cthink\u003e"},"done":false}
QJsonDocument doc = QJsonDocument::fromJson(buf); // 将读取到的 JSON 数据解析为 QJsonDocument 对象
QJsonObject obj = doc.object(); // 从 QJsonDocument 中获取 JSON 对象
// 从 JSON 对象中提取 "message" 字段下的 "content" 字段的值,并转换为字符串
QString answer = obj.value("message").toObject().value("content").toString();
qDebug()<< answer;
if(answer[0] != '<') // 如果答案的第一个字符不是 '<'
ui->textEdit_down->insertPlainText(answer);
QCoreApplication::processEvents(); // 处理当前的事件队列,确保界面能及时更新
//QString message = ui->textEdit_down->toPlainText();
//speeker->say(message);
}
}
//槽函数:接受车牌信息,将识别到的车牌信息显示到car_line上
void Widget::read_ack(QNetworkReply* r)
{
QByteArray buf = r->readAll();
qDebug() << buf; // 输出响应数据到调试信息中
QJsonDocument myjson = QJsonDocument::fromJson(buf);
QJsonObject node = myjson.object(); // 获取 JSON 文档的根对象
QJsonObject arr = node.value("words_result").toObject();
QString text = arr.value("number").toString();
ui->car_line->setText(text);
QSqlQuery query1("SELECT packing FROM packing_t");
QSet<int> existingNumbers;
while (query1.next()) {
int number = query1.value(0).toInt();
existingNumbers.insert(number);
}
// 生成1到60的随机数,直到生成一个不在数据库中的数
QRandomGenerator randomGenerator;
int randomNumber;
do {
randomNumber = randomGenerator.bounded(1, 61);
} while (existingNumbers.contains(randomNumber));
QDateTime currentDateTime = QDateTime::currentDateTime();
QString formattedDateTime = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
QString sql = QString("insert into packing_t values('%1','%2','%3','%4','%5')")
.arg(randomNumber).arg(text).arg(0).arg(0).arg(formattedDateTime);
qDebug()<<"sql:"<<sql;
QSqlQuery query;
if(!query.exec(sql)){
qDebug()<<"insert:"<<query.lastError().text();
return;
}
QString message = QString("欢迎光临小球藻停车场:%1 ,驶进时间:%2,费用5元每小时").arg(text).arg(formattedDateTime);
//语音播报
speeker->say(message);
QMessageBox::information(this,"提示",message);
}
void Widget::on_pushButton_clicked() // 停车场智能助手信息发送
{
ui->textEdit_down->clear();
QNetworkRequest _quest; // 创建一个 QNetworkRequest 对象,用于设置网络请求的相关信息
_quest.setUrl((QUrl("http://127.0.0.1:11434/api/chat")));
_quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
QJsonDocument document;
QJsonObject obj;
obj.insert("model","deepseek-r1:7b");
QJsonObject obj1;
obj1.insert("role","system");
obj1.insert("content","请用一句话介绍"+ui->textEdit_up->toPlainText());
QJsonArray arr;
arr.append(obj1);
// 示例格式:obj.insert("messages": [{"role": "system", "content": "您是足球专家"}]);
obj.insert("messages",arr);
document.setObject(obj);
QByteArray _postData = document.toJson(QJsonDocument::Compact);
httphelper->post(_quest,_postData);
}
void Widget::on_pushButton_2_clicked() //进入:上传车牌图片
{
QString filePath = QFileDialog::getOpenFileName(this, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg)"); // 打开文件对话框,让用户选择图片文件
if (!filePath.isEmpty()) {
QPixmap pixmap(filePath);
if (!pixmap.isNull()) {
ui->label->setPixmap(pixmap.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
}
}
void Widget::on_pushButton_3_clicked() //进入:识别车牌图片
{
if (ui->label->pixmap() == nullptr) {
QMessageBox::warning(this, "警告", "未识别到车牌,请上传图片。");
return;
}
ui->textEdit_down->clear();
QString accessToken = "24.4b9109f3097e6023cda0792ed68c9708.2592000.1748943185.282335-118743090";
QUrl url("https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate");
QUrlQuery query;
query.addQueryItem("access_token", accessToken);
url.setQuery(query);
QNetworkRequest myrequset; // 创建请求对象
myrequset.setUrl(url); // 设置请求的 URL
myrequset.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
// 获取图片并进行 Base64 编码
QPixmap pixmap = *ui->label->pixmap();
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
pixmap.save(&buffer, "PNG");
QByteArray buf64 = byteArray.toBase64().toPercentEncoding();
QByteArray body = "image=" + buf64;
httpmanager->post(myrequset, body);
}
void Widget::on_cha_clicked() //进入查询界面
{
this->hide();
form->show();
QTableWidget *tableWidget = form->getTableWidget();
tableWidget->clearContents();
tableWidget->setRowCount(0);
QSqlQuery query("SELECT * FROM packing_t", QSqlDatabase::database());
if (query.exec()) {
int row = 0;
while (query.next()) {
tableWidget->insertRow(row);
for (int col = 0; col