Qt應用MySQL小結

2021-08-06 04:20:53 字數 4126 閱讀 9924

二qsqltablemodel類

三qsqlrelationaltablemodel類參考

本著應用驅動學習的理念,實踐了兩個qt+mysql的小專案,《列車時刻表查詢系統》和《酒店客房管理系統》,熟悉了qt運算元據庫的主要方法,簡要總結於此。

qsqlquery

query;

query.prepare("insert into person (id, forename, surname) "

"values (:id, :forename, :surname)");

query.bindvalue(":id", 1001);//繫結要插入的值

query.bindvalue(":forename", "bart");

query.bindvalue(":surname", "simpson");

query.exec();

:id相當於佔位符,還可用?addbindvalue()、序號等繫結操作,execbatch()批量操作,詳見qt assistant。

qsqlquery query;  

query.exec("select * from t_student"); // 查詢的結果可能不止一條記錄,所以我們稱之為結果集

while (query.next())

實際應用如列車時刻表查詢中的翻頁操作,利用了first() 、next()等函式。

qsqltablemodel類提供了乙個可讀寫單張sql表的可編輯資料模型,功能:修改,插入,刪除,查詢,和排序。

該模型完全脫離了sql語句,可以利用它進行大部分常用的操作,將修改先儲存到model中,然後執行提交修改,寫入資料庫。

qsqltablemodel *model =

new qsqltablemodel;

model->settable("person");

model->seteditstrategy(qsqltablemodel::onmanualsubmit);

model->

select();

model->removecolumn(0); // don't show the id

model->setheaderdata(0, qt::horizontal, tr("name"));

model->setheaderdata(1, qt::horizontal, tr("salary"));

ui->tableview->setmodel(model);

ui->tableview->show();

model->setfilter(qobject::tr(「name = 『%1′」).arg(name)); //根據姓名進行篩選  

model->select(); //顯示結果

for (int i = 0; i < model.rowcount(); ++i)

// 在操作大資料集時,建議通過索引指定字段

int primarykeyindex = model.record().indexof("id");

for (int i = 0; i < model.rowcount(); ++i)

model->setsort(0,qt::ascendingorder); //id屬性,即第0列,公升序排列,qt::descendingorder為降序排序  

model->

select();

int rownum = model->rowcount(); //獲得表的行數  

int id = 最後乙個id+

1;

model->insertrow(rownum); //新增一行,或者用insertrows(0,1),在0行新增1條記錄,根據表的排序規則,可能移到與指定行不同的行位置上

model->setdata(model->index(rownum,0),id); //因為這裡設定了id為主鍵,所以必須給新行新增id屬性值,id欄位在第0列上

model->submitall(); //可以直接提交

model.setfilter("id = 10");  

model.select();

if (model.rowcount() == 1)

int currow = tableview->currentindex().row();  

model->removerow(currow); //刪除選中的一行

qitemselectionmodel *selections = tableview->selectionmodel(); //返回當前的選擇模式  

qmodelindexlist selecteds = selections->selectedindexes(); //返回所有選定的模型專案索引列表

foreach (qmodelindex index, selecteds)

int ok = qmessagebox::warning(this,tr("刪除選中的行!"),tr("你確定刪除當前選取中的行嗎?"),qmessagebox::yes,qmessagebox::no);

if(ok == qmessagebox::yes)

else

model.setfilter("id = 10");  //先定位記錄

model.select();

if (model.rowcount() == 1)

qsqlrelationaltablemodel繼承自qsqltablemodel,並且對其進行了擴充套件,提供了對外鍵的支援。

乙個外來鍵就是乙個表中的乙個屬性和其他表中的主鍵屬性之間的一對一的對映。例如,student表中的course屬性對應的是course表中的id屬性,那麼就稱屬性course是乙個外來鍵。因為這裡的course屬性的值是一些數字,這樣的顯示很不友好,使用關係**模型,就可以將它顯示為course表中的name屬性的值。

model =

new qsqlrelationaltablemodel(this);

//屬性變化時寫入資料庫

model->seteditstrategy(qsqltablemodel::onfieldchange);

model->settable("student");

//將student表的第三個屬性設為course表的id屬性的外來鍵,

//並將其顯示為course表的name屬性的值

model->setrelation(2,qsqlrelation("course","id","name"));

model->setheaderdata(0, qt::horizontal, qobject::tr("id"));

model->setheaderdata(1, qt::horizontal, qobject::tr("name"));

model->setheaderdata(2, qt::horizontal, qobject::tr("course"));

model->

select();

ui->tableview->setmodel(model);

實際應用如列車時刻表查詢中的沿途車站資訊中:

model->settable("stations_train_pass");//詳細資訊要開啟的表

//將stations_train_pass表中的sid(第1列,從0開始計數)設為stations表的sid屬性的外來鍵

//並將其顯示為stations表的sname屬性的值

model->setrelation(1,qsqlrelation("stations","sid","sname"));

qt筆記:資料庫總結(三)之sql模型類-qsqltablemodel模型

Qt外掛程式應用小結

1.當乙個外掛程式具有多個inte ce的時候,使用qpluginloader得到外掛程式的object後,可以將object分別轉為各個介面型別 例如 qt example basictools 外掛程式 和 plugandpaint 使用外掛程式 qt的兩個例子 class basictools...

QT使用小結

在qt中如果要在控制台輸出資訊,一般是使用qdebug 如果要使用c 中的std cout該怎麼辦呢?在qt5.12下,是可以直接使用std cout的,但是並不會馬上輸出,會等到快取區滿了才輸出,或者每次輸出都輸出乙個換行endl。qt作為乙個ui開發工具,通常需要與第三方工具相結合一起進行開發,...

Qt拖拽事件小結

這裡拿前段時間遇到的乙個問題來講解一下對於拖拽事件的以及qt部件的一些理解。左側有兩個qtextedit,右側是乙個qlistwidget,裡面列舉了一些顏色名稱,想要實現的拖拽動作是通過點選拖拽右側qlistwidget中的內容,拖放到左側的qtextedit中。實現思路有兩種,第一種,繼承qte...