一 ,前言
之前18.QListView添加刪除修改的應(yīng)用--Apple的學(xué)習(xí)筆記中已經(jīng)描述,Qistview顯示的內(nèi)容沒有和數(shù)據(jù)庫綁定,所謂的添加刪除修改都是臨時的。今天我加入數(shù)據(jù)庫存儲。當(dāng)然存儲形式可以有多種,包括json,ini,xml等等。但是我選擇sqlite,為的是便于后續(xù)的實驗,并且我將來的工具需要用到sqlite數(shù)據(jù)庫。
二,需求
listview綁定sqlite進(jìn)行數(shù)據(jù)查詢顯示及修改保存。
三,遇到的問題
1. QT自帶的sqlmodel能綁定到Qlistview顯示嗎?
答:不能吧,暫時我不清楚方法。主要是覺得沒必要,2者不搭配。
2. 如何把數(shù)據(jù)傳遞到sql的語句中?
答:用prepare加exec語法來準(zhǔn)備和執(zhí)行數(shù)據(jù),當(dāng)然綁定數(shù)據(jù)用bindValue方法。其實和printf傳參類似的用法。
3. 表的主鍵和row如何綁定?
答:我自建了一個record和row綁定,但是row被刪除后也會變。所以最后設(shè)置為listname唯一,作為主鍵。
4. 刪除一條后其他條目信息在界面上全為空白?
答:我用的是listView->currentIndex().data().toString()若刪除后,此值為空。所以slm->removeRow(row);要放在sqlite操作后面進(jìn)行。最后我的代碼如下
void Widget::deleteItem()
{
int row = listView->currentIndex().row();
//執(zhí)行sql數(shù)據(jù)刪除
setDataInfo(0,listView->currentIndex().data().toString(),"uint8","uint8",1);
//做刪除動作則先改本地數(shù)據(jù)庫,再在模型數(shù)據(jù)庫,否則currentIndex會變化。
slm->removeRow(row);
//指向上一行
if(slm->rowCount())
{
//qDebug("focus on %d",row);
itemClicked(slm->index(row,0));
}
else //模型中已無數(shù)據(jù)
{
pages->setCurrentIndex(0);
}
}
5. list數(shù)據(jù)綁定的界面信息如何切換
答:選擇的list進(jìn)行name查詢后,將獲取的數(shù)據(jù)設(shè)置到右邊的LineEdit文本框即可。
void Widget::itemClicked(const QModelIndex &item)
{
curselectItem = item;
if(pages->currentIndex() == 0)
{
pages->setCurrentIndex(1);
}
qDebug()<<"itemClicked";
//界面信息更新
setDataInfo(0,listView->currentIndex().data().toString(),"uint8","uint8",3);
}
6. QLineEdit編輯完成光標(biāo)移走及回車的信號是什么?
答:查看help可以知道信號為editingFinished。我的信號綁定如下
void DataProperties::InitConnect()
{
connect(m_txtlist[0], &QLineEdit::editingFinished, this, &DataProperties::updateNameInfo);
connect(m_txtlist[1], &QLineEdit::editingFinished, this, &DataProperties::updateNameInfo);
connect(m_txtlist[2], &QLineEdit::editingFinished, this, &DataProperties::updateNameInfo);
}
四,效果
軟件一運行就從創(chuàng)建新的數(shù)據(jù)庫開始。沒有判斷若已經(jīng)有數(shù)據(jù)庫,則顯示界面。這部分要實現(xiàn)也容易,將來有需求再加入即可。

五,小結(jié)
從實際應(yīng)用角度學(xué)習(xí)了下,把Listview和數(shù)據(jù)庫聯(lián)動。但是僅適合小數(shù)據(jù)庫,因為我界面一更新就會去操作數(shù)據(jù)庫,沒有用到緩存技術(shù),并且我也沒有使用自定義itemmodule,所以這樣的設(shè)計方法效率不高,適用于簡單的小型數(shù)據(jù)庫快速開發(fā)。