一 ,前言
之前18.QListView添加删除修改的应用--Apple的学习笔记中已经描述,Qistview显示的内容没有和数据库绑定,所谓的添加删除修改都是临时的。今天我加入数据库存储。当然存储形式可以有多种,包括json,ini,xml等等。但是我选择sqlite,为的是便于后续的实验,并且我将来的工具需要用到sqlite数据库。
二,需求
listview绑定sqlite进行数据查询显示及修改保存。
三,遇到的问题
1. QT自带的sqlmodel能绑定到Qlistview显示吗?
答:不能吧,暂时我不清楚方法。主要是觉得没必要,2者不搭配。
2. 如何把数据传递到sql的语句中?
答:用prepare加exec语法来准备和执行数据,当然绑定数据用bindValue方法。其实和printf传参类似的用法。
3. 表的主键和row如何绑定?
答:我自建了一个record和row绑定,但是row被删除后也会变。所以最后设置为listname唯一,作为主键。
4. 删除一条后其他条目信息在界面上全为空白?
答:我用的是listView->currentIndex().data().toString()
若删除后,此值为空。所以slm->removeRow(row);
要放在sqlite操作后面进行。最后我的代码如下
void Widget::deleteItem()
{
int row = listView->currentIndex().row();
//执行sql数据删除
setDataInfo(0,listView->currentIndex().data().toString(),"uint8","uint8",1);
//做删除动作则先改本地数据库,再在模型数据库,否则currentIndex会变化。
slm->removeRow(row);
//指向上一行
if(slm->rowCount())
{
//qDebug("focus on %d",row);
itemClicked(slm->index(row,0));
}
else //模型中已无数据
{
pages->setCurrentIndex(0);
}
}
5. list数据绑定的界面信息如何切换
答:选择的list进行name查询后,将获取的数据设置到右边的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编辑完成光标移走及回车的信号是什么?
答:查看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);
}
四,效果
软件一运行就从创建新的数据库开始。没有判断若已经有数据库,则显示界面。这部分要实现也容易,将来有需求再加入即可。
image.png
五,小结
从实际应用角度学习了下,把Listview和数据库联动。但是仅适合小数据库,因为我界面一更新就会去操作数据库,没有用到缓存技术,并且我也没有使用自定义itemmodule,所以这样的设计方法效率不高,适用于简单的小型数据库快速开发。
网友评论