第一步、先配置CMakeLists.txt
在CMakeLists.txt中添加
find_package(Qt6 REQUIRED COMPONENTS Sql)
find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)
避免在包含Qsql庫中出現不存在的情況。
第二步、在資源文件中添加.DB文件
先創建resource file。
創建了一個命名為data.qrc的文件,并在cmake中添加該文件。
添加.db文件。
第二步、打開數據庫,創建表頭,增刪改查
//打開數據庫
//獲得一個基于SQLite的數據庫連接對象db = QSqlDatabase::addDatabase("QSQLITE");//設置數據庫文件的名稱db.setDatabaseName("./raic.db"); // 數據庫文件為raic.db
if (!db.open())
{qDebug() << "默認數據庫打開失敗" << db.lastError();
}
//創建表頭
void Composition::createTable()
{QString sql="CREATE TABLE composition(id INTERGER PERIMARY KEY,material TEXT,yvalue INTERGER,createtimestamp TEXT,createtime DATETIME)";//數據庫操作類QSqlQuery sq;if(sq.exec(sql)){qDebug()<<"建表成功!";}else{qDebug()<<sq.lastError().text();//上一次操作的錯誤信息}
}
//增加數據
void MainWindow::on_insertBtn_clicked()
{int materialID = ui->lineEdit->text().toInt();QString material = ui->lineEdit_2->text();int yvalue = ui->lineEdit_3->text().toInt();QDateTime time = QDateTime::currentDateTime();QString timestr = time.toString("yyyy-MM-dd hh::mm::ss");qint64 timeT = time.toMSecsSinceEpoch();qDebug()<<timeT;ui->lineEdit_4->setText(QString::number(timeT));ui->lineEdit_5->setText(timestr);Composition com;com.materialID = materialID;com.material = material;com.yvalue = yvalue;com.createtimestamp = timeT;com.createtime = timestr;Composition::insertCompositionToDatabase1(com);
}
第四步、根據數據庫的數據畫圖
//畫分布圖
QDateTimeEdit//起始時間框
QChartview//畫布//皮帶上物料的分布
void MainWindow::on_beltclassify_clicked()
{QList<int> beltMaterialList;// 判斷時間int64 beginT = ui->startdateTimeEdit->dateTime().toMSecsSinceEpoch();int64 endT = ui->enddateTimeEdit->dateTime().toMSecsSinceEpoch();if (beginT >= endT){QMessageBox::information(this, "起止時間", "開始時間必須小于結束時間");return;}Composition::getPeriodYvalueInfoFromDatabase(&beltMaterialList, beginT, endT);if (beltMaterialList.count() == 0){qDebug() << "當前條件下無皮帶上物料分布數據";QMessageBox::information(this, "物料分布", "當前條件下無皮帶上物料分布數據");return;}// 繪制皮帶上物料分布柱狀圖beltMaterialBarChart(&beltMaterialList);
}void Composition::getPeriodYvalueInfoFromDatabase(QList<int> *list, qint64 beginStamp, qint64 endStamp)
{// 根據時間范圍查詢所有物料的y值QSqlQuery query;QString sqlstr;sqlstr = QString("SELECT yvalue FROM composition WHERE createtimestamp >= %1 AND createtimestamp <= %2").arg(beginStamp).arg(endStamp);// qDebug() << "物料成分查詢記錄sql: " << sqlstr;query.exec(sqlstr);while (query.next()){QSqlRecord record = query.record();int y = record.value("yvalue").toInt();list->append(y); // 將獲取到的物料成分信息追加到鏈表中}
}void MainWindow::beltMaterialBarChart(QList<int> *list)
{if (list->count() < 1){qDebug() << "valveBarChart:無數據";return;}// 整理數據int data[5] = {0};QList<QString> axisXLabels;// axisXLabels << "0-200"<< "200-400"<< "400-600"<< "600-800"<< "800-1000"; //5axisXLabels << "1"<< "2"<< "3"<< "4"<< "5"; // 5foreach(int y, *list){if (y >1000){y = 1000;}if (y < 0){y = 0;}data[y/200]++; // 向下取整 配合從0開始的索引 正好}QChart *chart = new QChart();QBarSet *set = new QBarSet("數量"); // 創建條線數據QBarCategoryAxis *axisX = new QBarCategoryAxis; // 創建X軸axisX->append(axisXLabels);int max = 0;for(int i = 0; i<5;i++){*set << data[i];if (data[i] > max)max = data[i];}// 設置X軸字體大小QFont font;font.setPointSize(12);axisX->setLabelsFont(font);set->setLabelFont(font); // 調整柱子上數字的大小set->setLabelColor(Qt::black); // 用了主題 顏色被覆蓋了QBarSeries *series = new QBarSeries();series->append(set);series->setVisible(true);series->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd); //設置標簽顯示的位置series->setLabelsVisible(true); //設置數據標簽可見chart->addSeries(series); // 添加系列到QChart上// 創建Y軸QValueAxis *axisY = new QValueAxis;axisY->setRange(0, ceil(max * 0.1 * 1.1) * 10);axisY->setLabelFormat("%d");// 設置Y軸字體大小axisY->setLabelsFont(font);axisY->setVisible(false);chart->addAxis ( axisX, Qt::AlignBottom );chart->addAxis ( axisY, Qt::AlignLeft );series->attachAxis ( axisX );series->attachAxis ( axisY );//修改圖例chart->legend()->hide();chart->setTitle("皮帶物料分布");// 設置表格主題
// chart->setTheme(QChart::ChartThemeBlueCerulean);chart->setTheme(QChart::ChartThemeDark);chart->setAnimationOptions(QChart::AllAnimations); //動畫效果ui->beltView->setChart(chart);ui->beltView->setRenderHint(QPainter::Antialiasing);
}
void MainWindow::on_materialclassify_clicked()
{int64 beginT = ui->startdateTimeEdit->dateTime().toMSecsSinceEpoch();int64 endT = ui->enddateTimeEdit->dateTime().toMSecsSinceEpoch();if (beginT >= endT){QMessageBox::information(this, "起止時間", "開始時間必須小于結束時間");return;}QList<int> MaterialList;Composition::getmaterialInfoFromDatabase(&MaterialList, beginT, endT);if (MaterialList.count() == 0){qDebug() << "當前條件下無皮帶上物料分布數據";QMessageBox::information(this, "物料分布", "當前條件下無皮帶上物料分布數據");return;}setpieChart(&MaterialList);}void MainWindow::setpieChart(QList<int> *list)
{if (list->count() < 1){qDebug() << "valveBarChart:無數據";return;}double blackNum = 0, AggreNum = 0;foreach(int y, *list){if (y ==0){blackNum++ ;}if (y== 1){AggreNum++;}}double total = blackNum+AggreNum;
// qDebug()<<"混凝土"<<AggreNum;
// qDebug()<<"紅磚"<<blackNum;
// qDebug()<<"總計"<<total;double Blackpart =qCeil( blackNum/total*100);double Aggrepart = qFloor(AggreNum/total*100);
// qDebug()<<"紅磚占比"<<Blackpart;
// qDebug()<<"混凝土占比"<<Aggrepart;m_mySeries = new QPieSeries();m_mySeries->append("紅磚",Blackpart);m_mySeries->append("混凝土",Aggrepart);QPieSlice *myRed = m_mySeries->slices().at(0);QPieSlice *myGreen = m_mySeries->slices().at(1);myRed->setColor(QColor(255,0,0,255));myRed->setLabelVisible();myGreen->setColor(QColor(0,255,0,255));myGreen->setLabelVisible();QChart *myChart = new QChart;myChart->addSeries(m_mySeries);QFont font;font.setPointSize(8);myChart->setTitle("混凝土和紅磚分布");myChart->setTitleFont(font);myChart->legend()->hide(); //隱藏圖例
// myChart->setTheme(QChart::ChartThemeBlueNcs); //設置主題myChart->setTheme(QChart::ChartThemeDark);myChart->setAnimationOptions(QChart::AllAnimations); //動畫效果ui->materialView->setChart(myChart);ui->materialView->setRenderHint(QPainter::Antialiasing);}
最終圖示: