QT7_視頻知識點筆記_67_項目練習(頁面以及對話框的切換,自定義數據類型,DB數據庫類的自定義及使用)

視頻項目:7----汽車銷售管理系統(登錄,品牌車管理,新車入庫,銷售統計圖表)-----項目視頻沒有,代碼也不全,更改項目練習:學生信息管理系統。

學生信息管理系統:簡介:兩個頁面:主頁面+學生信息添加頁面(下面的例子僅舉例學號和姓名)

在這里插入圖片描述
在這里插入圖片描述

1.點擊添加按鈕彈出添加對話框

添加一個繼承自QDialog的QT界面類AddDialog(注意如果AddDialog是繼承QWidget的話在主頁面new 一個AddDialog的時候AddDialog頁面會直接顯示在主頁面上)
主頁面:

#include "adddialog.h"
...
AddDialog *m_addDialog;  //添加學生信息窗口//構造函數:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_addDialog = new AddDialog(this);
}
void Widget::on_pushButton_add_clicked()
{//點擊按鈕彈出新增窗口qDebug()<<"on_pushButton_add_clicked";m_addDialog->show();
}

2.添加按鈕點擊取消則關閉對話框

void AddDialog::on_btnCancel_clicked()
{qDebug()<<"on_btnCancel_clicked";this->close();
}

3.添加一個數據類定義需要存儲數據類型(子界面存入,傳遞給主界面顯示)

添加Q_DECLARE_METATYPE(type)宏,能使type類型讓所有基于模板的函數識別

#ifndef CSTUDENTINFO_H
#define CSTUDENTINFO_H#include <QString>
#include <QMetaType>class CStudentInfo
{
public:CStudentInfo();bool setData(int id,QString name);int id() const;void setId(int id);QString name() const;void setName(const QString &name);private://此處舉例僅用兩個數據信息類int m_id;              //學生id 四位數字QString m_name;        //學生名稱};Q_DECLARE_METATYPE(CStudentInfo)// 該宏放在類或結構體聲明的最后面
#endif // CSTUDENTINFO_H
#include "cstudentinfo.h"CStudentInfo::CStudentInfo()
{}bool CStudentInfo::setData(int id, QString name)
{m_id = id;m_name = name;return true;
}int CStudentInfo::id() const
{return m_id;
}void CStudentInfo::setId(int id)
{m_id = id;
}QString CStudentInfo::name() const
{return m_name;
}void CStudentInfo::setName(const QString &name)
{m_name = name;
}

在子界面上按這個數據類存進入:

void AddDialog::on_btnConfirm_clicked()
{qDebug()<<"on_btnConfirm_clicked";//......//把檢測合格的數據添加進入int id = ui->edtId->text().toInt();QString name = ui->edtName->text();//數據類型CStudentInfo stuInfo;stuInfo.setData(id,name);//僅進行數據的修改到主頁面,對話框不關閉emit sig_addStuInfo(stuInfo);
}

通過信號槽把數據類接收,并顯示在主頁面:
信號槽傳遞:

//關聯槽函數connect(m_addDialog,&AddDialog::sig_addStuInfo,this,&Widget::slot_addStuInfo);bool Widget::slot_addStuInfo(CStudentInfo &stuInfo)
{//收到添加對話框發出的信號,把添加的內容顯示到UI上appendToModel(stuInfo);		//此處可以收到信號傳來的return true;
}

主頁面model模型顯示:
構造函數中:

	//實例化modelm_standardModel = new QStandardItemModel(this);//設置tableView 菜單策略 customContextMenuRequested(const QPoint &pos)ui->tableView_StudentInfo->setContextMenuPolicy(Qt::CustomContextMenu);//添加表頭QStringList headerList;headerList<<"學號"<<"姓名";m_standardModel->setHorizontalHeaderLabels(headerList);ui->tableView_StudentInfo->setModel(m_standardModel);
bool Widget::appendToModel(CStudentInfo &stuInfo)
{QStandardItem *itemId = new QStandardItem(QString("%1").arg(stuInfo.id(),4,10,QLatin1Char('0')));itemId->setCheckable(true); //添加復選框itemId->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);QStandardItem *itemName = new QStandardItem(stuInfo.name());itemName->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);QList<QStandardItem*> rowItem;rowItem.append(itemId);rowItem.append(itemName);m_standardModel->appendRow(rowItem);return true;}

效果:(后續需要添加學號是否存在驗證等需另外再加入判斷)在這里插入圖片描述

4.加入數據庫進行數據的長期存儲,主頁面顯示,子頁面寫入,以及刪除功能

先創建一個數據庫的類CDataSQLite:

#ifndef CDATASQLITE_H
#define CDATASQLITE_H#include "cstudentinfo.h"
#include <QSqlDatabase>class CDataSQLite
{
public:CDataSQLite();/*** @brief 查詢所有信息* @param stuInfos* @return*///用來遍歷virtual bool selectStuInfos(QList<CStudentInfo> &stuInfoList) ;     //用來新增virtual bool addStuInfo(CStudentInfo &stuInfo) ;                    virtual bool updateStuInfo(CStudentInfo &stuInfo) ;//用來刪除virtual bool deleteStuInfo(int id) ;                                
private:QSqlDatabase m_db;  //數據庫連接
};#endif // CDATASQLITE_H

CDataSQLite的構造函數:

	//打開數據庫m_db = QSqlDatabase::addDatabase("QSQLITE"); //QMYSQLm_db.setDatabaseName("./stuInfoDB_demo.db"); // 相對路徑是相對于.exe所在的文件夾下(即bin文件夾下)if(!m_db.open()){qDebug() << "Failed to Open database";return;}qDebug() << "success Open ";//如果沒有這個表則會創建QSqlQuery query;QString sql = QString("create table if not exists tb_stuInfo""(id int primary key not null,""name varchar(50),""overallScore real);");if(!query.exec(sql)){qDebug() << "Failed to create table";qDebug() << query.lastQuery();return;}//關閉數據庫m_db.close();

bool CDataSQLite::addStuInfo(CStudentInfo &stuInfo)
{//新增if(!m_db.open()){qDebug() << "Failed to Open Database : addStuInfo";return false;}QSqlQuery query;query.prepare("insert into tb_stuInfo (id,name)""values(:id,:name)");query.bindValue(":id",stuInfo.id());query.bindValue(":name",stuInfo.name());if(!query.exec()){qDebug() << query.lastQuery();m_db.close();return false;}m_db.close();return true;}bool CDataSQLite::selectStuInfos(QList<CStudentInfo> &stuInfoList)
{//查詢if(!m_db.open()){qDebug() << "Failed to Open Database : selectStuInfos";return false;}QSqlQuery query;QString sql = "Select * from tb_stuInfo;";if(!query.exec(sql)){qDebug() << "Failed to selcet tb_stuInfo;";return false;}while(query.next()){CStudentInfo stuInfo;int id = query.value("id").toInt();QString name = query.value("name").toString();stuInfo.setData(id,name);stuInfoList.append(stuInfo);}m_db.close();return true;
}bool CDataSQLite::deleteStuInfo(int id)
{if(!m_db.open()){qDebug() << "Failed to Open Database : deleteStuInfo";return false;}QSqlQuery query;QString sql = QString("delete from tb_stuInfo where id = %1").arg(id);if(!query.exec(sql)){qDebug() << "Failed to delete stuInfo!!!";m_db.close();return  false;}m_db.close();return true;
}

使用CDataSQLite數據庫類:
在主頁面中,構造函數中會先實例化數據庫類,然后進行遍歷查詢進行顯示。

//在.h文件中
CDataSQLite  *m_dataSource;  //數據源//.cpp構造函數中
//實例化數據源m_dataSource = new CDataSQLite();//查詢數據QList<CStudentInfo> stuInfoList;bool res = m_dataSource->selectStuInfos(stuInfoList);if(!res){QMessageBox::information(this,"提示","查詢學生信息失敗");return;}qDebug() << stuInfoList.size();for(int i=0;i<stuInfoList.size();++i){appendToModel(stuInfoList[i]);}

在新增頁面點擊確認發送信號之后,主頁面接收到信號在槽函數中進行數據庫類新增


//接收到子頁面的確認添加按鈕發出的處理信號的槽函數
bool Widget::slot_addStuInfo(CStudentInfo &stuInfo)
{//把數據添加到數據庫中bool res = m_dataSource->addStuInfo(stuInfo);if(!res){QMessageBox::information(this,"提示","插入失敗!!!");return false;}//收到添加對話框發出的信號,把添加的內容添加appendToModel(stuInfo);return true;
}

刪除:主頁面的刪除按鈕點擊之后槽函數:on_pushButton_delate_clicked,會把勾選的數據從數據庫中以及主頁面中刪除


void Widget::on_pushButton_delate_clicked()
{QMap<int,QStandardItem*> delRowsMap;  //待刪除的行for(int row = 0;row<m_standardModel->rowCount();++row){QStandardItem *item = m_standardModel->item(row);if(item->checkState() == Qt::Checked){delRowsMap.insert(row,item);}}if(delRowsMap.size()<1)return;//彈出刪除提示int res = QMessageBox::information(this,"提示","是否真的要刪除",QMessageBox::Yes|QMessageBox::No);if(res == QMessageBox::No) return;QList<int> keyList = delRowsMap.keys();//1.刪除數據庫中的數據for(int key=keyList.size()-1;key>=0;--key){if(m_dataSource->deleteStuInfo(delRowsMap.value(keyList[key])->text().toInt())){//2.刪除窗口中的數據m_standardModel->removeRow(keyList[key]);}}}

在這里插入圖片描述
(存著自己看看)
項目原例子源碼:鏈接
項目練習源碼(跟博客相同,但是功能相比原例子不全):鏈接

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

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

相關文章

大模型助力企業提效,九章云極DataCanvas公司聯合騰訊搜狗輸入法發布私有化解決方案

近日&#xff0c;九章云極DataCanvas公司與騰訊搜狗輸入法的合作再次升級。在搜狗輸入法開發者中心正式推出之際&#xff0c;九章云極DataCanvas公司作為搜狗輸入法的首批開發合作伙伴&#xff0c;雙方聯合發布“企業知識管理助手”私有化解決方案。 “企業知識管理助手”整體私…

Facebook的魅力:數字時代的社交熱點

在當今數字化時代&#xff0c;社交媒體已經成為人們日常生活中不可或缺的一部分&#xff0c;而Facebook作為其中的巨頭&#xff0c;一直以其獨特的魅力吸引著全球數十億用戶。本文將深入探討Facebook的魅力所在&#xff0c;以及它在數字時代的社交熱點。 1. 社交網絡的霸主&…

最新微信小程序面試題集結

1、微信小程序與H5的區別? 第一條是運行環境的不同 傳統的HTML5的運行環境是瀏覽器&#xff0c;包括webview&#xff0c;而微信小程序的運行環境并非完整的瀏覽器&#xff0c;是微信開發團隊基于瀏覽器內核完全重構的一個內置解析器&#xff0c;針對小程序專門做了優化&…

對于高速信號完整性,一塊聊聊啊(17)

再來對前仿和后仿的仿真內容回顧一下&#xff1a; 從概念上有個根本的理解 前仿真又可以分為布局前仿真和布局后仿真。前者是在設計的最初階段&#xff0c;建立和驗證詳細的電氣拓撲結構并以此制定出詳細的約束規則。后者是在布局完成的狀態下&#xff0c;在布線過程中遇到的…

隨機生成序列的某一排列

隨機生成1~n的某一排列&#xff0c;要求生成每種可能的排列的概率相同 。 算法描述&#xff1a; 給定數值分別為1~n的序列a&#xff0c; 循環變量i從1到n&#xff0c;每次循環將a[i]與a[i]~a[n]中的隨機某元素交換&#xff0c;最后a數組即為隨機生成的某一排列。 #include <…

【2024】C/C++框架和庫超全總結

本文分為2部分&#xff0c;第一部分&#xff1a;值得學習的C/C語言開源項目&#xff1b;第二部分是開源框架和庫 粉絲福利&#xff0c; 免費領取C/C 開發學習資料包、技術視頻/項目代碼&#xff0c;1000道大廠面試題&#xff0c;內容包括&#xff08;C基礎&#xff0c;網絡編程…

MATLAB分類與判別模型算法:基于LVQ神經網絡的乳腺腫瘤診斷分類程序【含Matlab源碼 MX_003期】

說明 實現基于LVQ&#xff08;Learning Vector Quantization&#xff0c;學習向量量化&#xff09;神經網絡的乳腺腫瘤診斷分類任務。LVQ是一種監督學習算法&#xff0c;通常用于模式識別和分類任務。 算法思路介紹&#xff1a; 導入數據&#xff1a; 加載名為"data.mat&…

2024下半年軟考報名人數較去年減少,僅52.77萬

2024下半年軟考報名人數 2024年上半年軟考考試共計報考52.77萬人&#xff0c;其中&#xff0c;初級資格5.12萬人、中級資格24.37萬人、高級資格23.28萬人。 根據往年報名人數&#xff0c;本次考試人數是減少了的&#xff0c;原因分析如下&#xff1a; 1、原來報名熱門專業系…

C++的unique_ptr::release

釋放給調用方返回的存儲指針的所有權&#xff0c;并將存儲的指針值設置為nullptr。 使用 release接管unique_ptr存儲的原始指針的所有權。 調用方負責返回的指針的刪除。 unique-ptr設置為空的默認構造狀態。 在調用到release后&#xff0c;您可以將兼容類型的另一個指針分配到…

SSL證書申請需要多久?

SSL證書作為一種重要的網絡安全工具&#xff0c;能夠確保網站數據傳輸的安全&#xff0c;保護用戶隱私和企業數據不受侵害。本文將詳細介紹SSL證書的申請流程以及所需時間&#xff0c;幫助用戶更好地規劃和實施網絡安全策略。 SSL證書&#xff0c;也稱為TLS證書或HTTPS證書&am…

rest_asyncio 簡化和管理異步python編程中的 REST API 調用

簡介 rest_asyncio 是一個 Python 庫,用于簡化和管理異步編程中的 REST API 調用。它結合了 aiohttp 和 asyncio,提供了一種高效的方式來處理網絡請求和響應,特別是在需要大量并發請求的場景下,例如爬蟲、批量數據獲取或實時數據處理。 以下是 rest_asyncio 的主要功能和…

富格林:領會正規阻撓欺詐技巧

富格林悉知&#xff0c;在當今經濟不穩定的環境下&#xff0c;投資者們越來越傾向于將資金投入到相對安全和穩定的資產中&#xff0c;而黃金往往是他們的首選之一。但現貨黃金市場相對復雜&#xff0c;因此要想在這個市場中立足腳跟就得領會正規阻撓欺詐的技巧。以下富格林為大…

如何優化工時表管理,提升團隊效率?

時間就是金錢&#xff0c;對于企業來說&#xff0c;有效的工時表管理可以讓一切變得不同。 本文將介紹控制工時表并將業務推向新高度的策略和工具。從多級審批工作流程到利用技術&#xff0c;了解如何克服常見挑戰&#xff0c;收獲簡化工時管理流程的回報。 工時表管理,工時表…

Ardupilot開源飛控之AP_Follow

Ardupilot開源飛控之AP_Follow 1. 源由2. 定義2.1 ModeFollow類2.1.1 ModeFollow::update2.1.2 ModeFollow::_enter2.1.3 ModeFollow::_exit 2.2 AP_Follow類2.2.1 AP_Follow::handle_msg2.2.2 AP_Follow::get_target_location_and_velocity2.2.3 AP_Follow::get_velocity_ned …

getContentView(mBinding.getRoot()); 會導致內存泄露嗎?里面有SurfaceView ViewBinding

在上述代碼中&#xff0c;ActivityTestingBinding 是一個 Data Binding 庫生成的類&#xff0c;用于綁定 XML 布局到 Activity 中。inflate(getLayoutInflater()) 用于將布局文件解析并轉換為對應的視圖層次結構。然后 getWindow().setFlags() 設置窗口屬性&#xff0c;保持屏幕…

小型海外倉如何選擇第三方海外倉系統:多看多對比,性價比優先

在現在的海外倉市場中&#xff0c;中小型海外倉&#xff0c;家庭海外倉的占比還是非常大的。這類海外倉的一個共同點就是資金有限&#xff0c;管理能力比較弱&#xff0c;很難實現規模效應。 對于這類海外倉來說&#xff0c;選擇一套合適的第三方海外倉系統&#xff0c;對提升…

好用的國產大文件傳輸軟件有哪些,快來看看吧

在這個數字化飛速發展的時代&#xff0c;我們每天都在與各種文件打交道&#xff0c;從簡單的文檔到龐大的視頻素材&#xff0c;文件的體積越來越大&#xff0c;傳統的文件傳輸方式逐漸顯得力不從心。面對這個挑戰&#xff0c;大文件傳輸軟件應運而生&#xff0c;它們不僅解決了…

note-網絡是怎樣連接的4 接入網和網絡運營商

助記提要 網絡包從用戶傳輸到互聯網的過程信號的調制方式ADSL使用多個頻率的合成波傳輸信號分離器的作用電話線的特點光纖的構造光纖的原理單模光纖和多模光纖光纖接入網的兩種接入方式PPP撥號上網過程ADSL和FTTH使用PPPoE的方式PPPoE的規則隧道其他接入認證方式 PPPoA和DHCP網…

基于大數據的高校生源可視化分析系統

基于大數據的高校生源可視化分析系統 “A Visual Analysis System for Higher Education Student Enrollment based on Big Data” 完整下載鏈接:基于大數據的高校生源可視化分析系統 文章目錄 基于大數據的高校生源可視化分析系統摘要第一章 引言1.1 研究背景1.2 研究目的1.…

adam優化器計算過程(tensorflow)

一、adam原理 原理 應用 優點 缺點 二、手動實現 一步一步計算 三、使用tensorflow api實現 api使用 四、一個具體的深度學習的例子