19.QListview绑定到数据库--Apple的学习笔记

一 ,前言

之前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,所以这样的设计方法效率不高,适用于简单的小型数据库快速开发。

你可能感兴趣的:(19.QListview绑定到数据库--Apple的学习笔记)