freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

qt數(shù)據(jù)庫操作-資料下載頁

2025-08-04 22:50本頁面
  

【正文】 。 .arg(modellastError().text()))。 }} 這里用到了事務(wù)操作,真正起提交操作的是modelsubmitAll()一句,它提交所有更改。“撤銷修改”按鈕單擊事件槽函數(shù),并更改如下:void Widget::on_pushButton_2_clicked() //撤銷修改{ modelrevertAll()。}它只有簡單的一行代碼。:include QMessageBoxinclude QSqlError此時運行程序,效果如下:我們將“陳剛”改為“李強”,如果我們點擊“撤銷修改”,那么它就會重新改為“陳剛”,而當(dāng)我們點擊“提交修改”后它就會保存到數(shù)據(jù)庫,此時再點擊“撤銷修改”就修改不回來了。可以看到,這個模型可以將所有修改先保存到model中,只有當(dāng)我們執(zhí)行提交修改后,才會真正寫入數(shù)據(jù)庫。當(dāng)然這也是因為我們在最開始設(shè)置了它的保存策略:modelsetEditStrategy(QSqlTableModel::OnManualSubmit)。OnManualSubmit表明我們要提交修改才能使其生效。第二,查詢操作。“查詢”按鈕的單擊事件槽函數(shù),更改如下:void Widget::on_pushButton_7_clicked() //查詢{ QString name = uilineEdittext()。 modelsetFilter(QObject::tr(name = 39。%139。).arg(name))。 //根據(jù)姓名進行篩選 modelselect()。 //顯示結(jié)果}我們使用setFilter()函數(shù)進行關(guān)鍵字篩選,這個函數(shù)是對整個結(jié)果集進行查詢。為了使用變量,我們使用了QObject類的tr()函數(shù)。“返回全表”按鈕的單擊事件槽函數(shù),更改如下:void Widget::on_pushButton_8_clicked() //返回全表{ modelsetTable(student)。 //重新關(guān)聯(lián)表 modelselect()。 //這樣才能再次顯示整個表的內(nèi)容}為了再次顯示整個表的內(nèi)容,我們需要再次關(guān)聯(lián)這個表。運行效果如下:我們輸入一個姓名,點擊“查詢”按鈕后,就可以顯示該記錄了。再點擊“返回全表”按鈕則返回。第三,排序操作。我們分別進入“按id升序排列”和“按id降序排列”按鈕的單擊事件槽函數(shù),更改如下:void Widget::on_pushButton_5_clicked() //升序{ modelsetSort(0,Qt::AscendingOrder)。 //id屬性,即第0列,升序排列 modelselect()。}void Widget::on_pushButton_6_clicked() //降序{ modelsetSort(0,Qt::DescendingOrder)。 modelselect()。}我們這里使用了setSort()函數(shù)進行排序,它有兩個參數(shù),第一個參數(shù)表示按第幾個屬性排序,表頭從左向右,最左邊是第0個屬性,這里就是id屬性。第二個參數(shù)是排序方法,有升序和降序兩種。運行程序,效果如下:這是按下“按id降序排列”按鈕后的效果。第四,刪除操作。我們進入“刪除選中行”按鈕單擊事件槽函數(shù),進行如下更改:void Widget::on_pushButton_4_clicked() //刪除當(dāng)前行{ int curRow = uitableViewcurrentIndex().row()。 //獲取選中的行 modelremoveRow(curRow)。 //刪除該行 int ok = QMessageBox::warning(this,tr(刪除當(dāng)前行!),tr(你確定 刪除當(dāng)前行嗎?), QMessageBox::Yes,QMessageBox::No)。 if(ok == QMessageBox::No) { modelrevertAll()。 //如果不刪除,則撤銷 } else modelsubmitAll()。 //否則提交,在數(shù)據(jù)庫中刪除該行}這里刪除行的操作會先保存在model中,當(dāng)我們執(zhí)行了submitAll()函數(shù)后才會真正的在數(shù)據(jù)庫中刪除該行。這里我們使用了一個警告框來讓用戶選擇是否真得要刪除該行。運行效果如下:我們點擊第二行,然后單擊“刪除選中行”按鈕,出現(xiàn)了警告框。這時你會發(fā)現(xiàn),表中的第二行前面出現(xiàn)了一個小感嘆號,表明該行已經(jīng)被修改了,但是還沒有真正的在數(shù)據(jù)庫中修改,這時的數(shù)據(jù)有個學(xué)名叫臟數(shù)據(jù)(Dirty Data)。當(dāng)我們按鈕“Yes”按鈕后數(shù)據(jù)庫中的數(shù)據(jù)就會被刪除,如果按下“No”,那么更改就會取消。第五,插入操作。我們進入“添加記錄”按鈕的單擊事件槽函數(shù),更改如下:void Widget::on_pushButton_3_clicked() //插入記錄{ int rowNum = modelrowCount()。 //獲得表的行數(shù) int id = 10。 modelinsertRow(rowNum)。 //添加一行 modelsetData(modelindex(rowNum,0),id)。 //modelsubmitAll()。 //可以直接提交} 我們在表的最后添加一行,因為在student表中我們設(shè)置了id號是主鍵,所以這里必須使用setData函數(shù)給新加的行添加id屬性的值,不然添加行就不會成功。這里可以直接調(diào)用submitAll()函數(shù)進行提交,也可以利用“提交修改”按鈕進行提交。運行程序,效果如下:按下“添加記錄”按鈕后,就添加了一行,不過在該行的前面有個星號,如果我們按下“提交修改”按鈕,這個星號就會消失。當(dāng)然,如果我們將上面代碼里的提交函數(shù)的注釋去掉,也就不會有這個星號了。 可以看到這個模型很強大,而且完全脫離了SQL語句,就算你不怎么懂?dāng)?shù)據(jù)庫,也可以利用它進行大部分常用的操作。我們也看到了,這個模型提供了緩沖區(qū),可以先將修改保存起來,當(dāng)我們執(zhí)行提交函數(shù)時,再去真正地修改數(shù)據(jù)庫。當(dāng)然,這個模型比前面的模型更高級,前面講的所有操作,在這里都能執(zhí)行。講完QSqlTableModel了,我們這次講這個類的擴展類QSqlRelationalTableModel,它們沒有太大的不同,唯一的就是后者在前者的基礎(chǔ)之上添加了外鍵(或者叫外碼)的支持。QSqlRelationalTableModel,該類為單張的數(shù)據(jù)庫表提供了一個可編輯的數(shù)據(jù)模型,它支持外鍵。我們還是新建Qt4 Gui Application工程,我這里工程名為relationalTableModel ,然后選中QtSql模塊,Base class選QWidget。工程建好后,添加C++ Header File ,更改其內(nèi)容如下:ifndef DATABASE_Hdefine DATABASE_Hinclude QSqlDatabaseinclude QSqlQuerystatic bool createConnection(){ QSqlDatabase db = QSqlDatabase::addDatabase(QSQLITE)。 ()。 if(!()) return false。 QSqlQuery query。 (create table student (id int primary key, name vchar,course int))。 (insert into student values (1,39。yafei039。,1))。 (insert into student values (2,39。yafei139。,1))。 (insert into student values (3,39。yafei239。,2))。 (create table course (id int primary key, name vchar, teacher vchar))。 (insert into course values (1,39。Math39。,39。yafeilinux139。))。 (insert into course values (2,39。English39。,39。yafeilinux239。))。 (insert into course values (3,39。Computer39。,39。yafeilinux339。))。 return true。}endif // DATABASE_H我們在這里建立了兩個表,student表中有一項是course,它是int型的,而course表的主鍵也是int型的。如果要將course項和course表進行關(guān)聯(lián),它們的類型就必須相同,一定要注意這一點。:include QtGui/QApplicationinclude include int main(int argc, char *argv[]){ QApplication a(argc, argv)。 if(!createConnection()) return 1。 Widget w。 ()。 return ()。}: include QSqlRelationalTableModel然后在private中聲明對象: QSqlRelationalTableModel *model。 View部件到窗體上,: model = new QSqlRelationalTableModel(this)。 modelsetEditStrategy(QSqlTableModel::OnFieldChange)。 //屬性變化時寫入數(shù)據(jù)庫 modelsetTable(student)。 modelsetRelation(2,QSqlRelation(course,id,name))。 //將student表的第三個屬性設(shè)為course表的id屬性的外鍵,并將其顯示為course表的name屬性的值 modelsetHeaderData(0, Qt::Horizontal, QObject::tr(ID))。 modelsetHeaderData(1, Qt::Horizontal, QObject::tr(Name))。 modelsetHeaderData(2, Qt::Horizontal, QObject::tr(Course))。 modelselect()。 uitableViewsetModel(model)。我們修改了model的提交策略,OnFieldChange表示只要屬性被改動就馬上寫入數(shù)據(jù)庫,這樣就不需要我們再執(zhí)行提交函數(shù)了。setRelation()函數(shù)實現(xiàn)了創(chuàng)建外鍵,注意它的格式就行了。運行效果如下:可以看到Course屬性已經(jīng)不再是編號,而是具體的課程了。關(guān)于外鍵,你也應(yīng)該有一定的認識了吧,說簡單點就是將兩個相關(guān)的表建立一個橋梁,讓它們關(guān)聯(lián)起來。那么我們也希望,如果用戶更改課程屬性,那么他只能在課程表中有的課程中進行選擇,而不能隨意填寫課程。在Qt中的QSqlRelationalDelegate委托類就能實現(xiàn)這個功能。我們只需在上面的構(gòu)造函數(shù)的最后添加一行代碼:uitableViewsetItemDelegate(new QSqlRelationalDelegate(uitableView))。添加代理(委托),在我這里不知為什么會出現(xiàn)SqlRelationalDelegate is not a type name的提示,不過可以編譯通過。: include QSqlRelationalDelegate運行效果如下:可以看到這時修改Course屬性時,就會出現(xiàn)一個下拉框,只能選擇course表中的幾個值。而利用這個類來操作數(shù)據(jù)庫,與前面講到的QSqlTableModel沒有區(qū)別,這里就不再重復(fù)。這幾篇文章一共講了好幾種操作數(shù)據(jù)庫的方法,到底應(yīng)該使用哪個呢?那就看你的需求了,根據(jù)這幾種方法的特點進行選擇吧。
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1