QT 數據庫的增加操作和畫圖 Win

第一步、先配置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);}

最終圖示:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696567.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696567.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot集成JWT實現token權限認證

vuespringboot登錄與注冊功能的實現 注&#xff1a;對于JWT的學習&#xff0c;首先要完成注冊和登錄的功能&#xff0c;本篇博客是基于上述博客的進階學習&#xff0c;代碼頁也是在原有的基礎上進行擴展 ①在pom.xml添加依賴 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及運行原理 和 權限

一. Shell命令及原理 Linux操作系統狹義上是Linux內核&#xff0c;廣義上是指Linux內核Linux外殼(Shell)和對應的配套程序 Linux外殼&#xff1a;Linux 外殼是用戶與內核之間的接口&#xff0c;用戶通過外殼與操作系統進行交互和操作。在 Linux 系統中&#xff0c;用戶可以選…

C語言——static的三大用法

被稱為面試愛考愛問題的它到底有何奧義 它難度不大并且非常常用&#xff0c;話不多說&#xff0c;直接開始 一、局部靜態變量 定義 在函數內部使用static修飾的變量被稱為局部靜態變量&#xff0c;與普通的局部變量不同&#xff0c;局部靜態變量在使用后不會被銷毀&#xff…

pycharm 遠程運行報錯 Failed to prepare environment

什么也沒動的情況下&#xff0c;遠程連接后運行是沒問題的&#xff0c;突然在運行時就運行不了了&#xff0c;解決方案 清理緩存&#xff1a; 有時候 PyCharm 的內部緩存可能出現問題&#xff0c;可以嘗試清除緩存&#xff08;File > Invalidate Caches / Restart&#xff0…

mysql優化指南之原理篇

之前碰到一個線上問題&#xff0c;在接手一個同事的項目后&#xff0c;因為工期比較趕&#xff0c;我還沒來得及了解業務背景和大致實現&#xff0c;只是了解了上線發布的順序和驗證方式就進行了上線&#xff0c;在上線進行金絲雀的時候系統還沒發生什么異常&#xff0c;于是我…

【面試題】談談MySQL的事務

事務是啥 MySQL的事務就是把多個sql語句操作打包在一起執行&#xff0c;要么全部執行&#xff0c;要么一個都別執行。這種操作稱為“原子性”&#xff0c;是事務最核心的特征。當某個sql操作出錯時&#xff0c;就會進行“回滾/rollback”操作&#xff0c;即把執行過的操作逆向…

MySQL數據庫進階第二篇(索引,SQL性能分析,使用規則)

文章目錄 一、索引概述二、索引結構三、結構 - B-Tree四、結構 - BTree五、結構 - Hash六、索引分類七、索引語法1.案例代碼 八、SQL性能分析1.查看SQl執行頻率2.慢查詢日志3.PROFILES詳情4.EXPLAIN執行計劃 九、 索引使用規則十、SQL 提示十一、覆蓋索引十二、前綴索引十三、單…

滾動加載react-infinite-scroll-component

react-infinite-scroll-component 當請求數據量過大時&#xff0c;接口返回數據時間會很長&#xff0c;數據回顯時間長&#xff0c;Dom 的渲染會有很大的性能壓力。 antd的List組件中有提到一個滾動加載的組件庫react-infinite-scroll-component 實現滾動加載 Antd&#xff1…

考研高數(高階導數的計算)

1.歸納法 常見高階導數 2.泰勒展開式 3.萊布尼茲公式 4.用導數定義證明導函數在某一點連續的例題

【kubernetes】二進制部署k8s集群之cni網絡插件flannel和calico工作原理(中)

↑↑↑↑接上一篇繼續部署↑↑↑↑ 目錄 一、k8s集群的三種接口 二、k8s的三種網絡模式 1、pod內容器之間的通信 2、同一個node節點中pod之間通信 3、不同的node節點的pod之間通信 Overlay Network VXLAN 三、flannel網絡插件 1、flannel插件模式之UDP模式&#xff0…

java對象所占內存大小輸出

如何計算java對象所占內存大小&#xff0c;可以使用下述三種方法。 使用jdk8自帶API 使用下面語句打印對象所占內存大小&#xff1a;需要保證jdk版本是jdk8。System.out.println(ObjectSizeCalculator.getObjectSize(3L)); 借助org.apache.lucene工具類 引入maven坐標 <…

2024/2/22

P8680 [藍橋杯 2019 省 B] 特別數的和 題目描述 小明對數位中含有 2、0、1、9 的數字很感興趣&#xff08;不包括前導 00&#xff09;&#xff0c;在 1 到 40 中這樣的數包括 1、2、9、10 至 32、39 和 40&#xff0c;共28 個&#xff0c;他們的和是574。 請問&#xff0c;在…

【2024軟件測試面試必會技能】

Unittest(5)&#xff1a;unittest_忽略用例 忽略用例 在執行測試腳本的時候&#xff0c;可能會有某幾條用例本次不想執行&#xff0c;但又不想刪也 不想注釋&#xff0c;unittest通過忽略部分測試用例不執行的方式&#xff0c;分無條件忽略和有條 件忽略,通過裝飾器實現所描述…

Vue3+vite搭建基礎架構(11)--- 菜單欄功能和Tab頁功能實現

Vue3vite搭建基礎架構&#xff08;11&#xff09;--- 菜單欄功能和Tab頁功能實現 說明刪除項目中不需要的文件userStore全局屬性代碼菜單欄代碼Tab頁代碼解決瀏覽器輸入地址時不會打開tab頁問題和切換tab頁時參數丟失問題 說明 這里記錄下自己在Vue3vite的項目使用less來寫樣式…

低代碼開發——企業轉型的萬金油

在數字化時代&#xff0c;企業面臨著日新月異的市場環境和激烈的競爭壓力。為了在這場變革中脫穎而出&#xff0c;企業需要不斷優化業務流程、提升創新能力&#xff0c;以及實現敏捷響應。在這個過程中&#xff0c;低代碼開發作為一種創新性的技術手段&#xff0c;正成為企業轉…

統信UOS_麒麟KYLINOS上監控網絡:探索Smokeping的強大功能

原文鏈接&#xff1a;統信UOS|麒麟KYLINOS上監控網絡&#xff1a;探索Smokeping的強大功能 在當今的網絡環境中&#xff0c;無論是個人用戶還是企業用戶&#xff0c;都非常重視網絡的穩定性和連通性。特別是在進行遠程工作、在線會議、云計算等活動時&#xff0c;網絡質量直接影…

程序員必備技能----刪庫跑路大總結

刪庫跑路大總結&#xff0c;各個都是大殺器&#xff0c;破壞性太大&#xff0c;輕易不要嘗試。 刪除linux根目錄&#xff0c;用戶目錄&#xff0c;其實還可以增加一個刪除/etc。刪除&#xff08;清除&#xff09;數據庫。刪除redis緩存和持久化文件。刪除mongodb庫。git push …

說一說Eclipse的項目類型和常用項目的區別

Eclipse在新建項目的時候有很多類型&#xff0c;包括Java project、Web project等等&#xff0c;如下&#xff1a; 那么這些項目類型有什么區別呢&#xff1f;我們在創建項目的時候應該如何選擇&#xff0c;了解清楚這一點還是非常重要的&#xff0c;但記住一個出發點&#xff…

2.22 day3、4 QT

完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示"登錄成功”&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面 如果賬號和密碼不匹配&…