操作sqlite数据库,使用qsqlqueryModel绑定数据,并实现对数据的修改

看大佬的相关博客发现 QsqlQueryModel只读属性,要让其可编辑要重写flags方法,要让其可修改要重写setData方法

具体代码如下:

widget构造函数主要实现加载sqlite数据库,如果没有数据库则创建。

widget.cpp文件

 
 
#include "widget.h"
#include <QSqlQueryModel>
 
 
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QTableView>
#include <QStandardItem>
#include <QSqlTableModel>
#include <QUuid>
MysqlQueryModel::MysqlQueryModel(QObject *parent):QSqlQueryModel(parent)
{
 
 
}
 
 
MysqlQueryModel::~MysqlQueryModel()
{
 
 
}
 
 
Qt::ItemFlags MysqlQueryModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
    if (index.column() != 0)
    {
        flags |= Qt::ItemIsEditable;
    }
    return flags;
}
 
 
bool MysqlQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    QModelIndex pkIndex = QSqlQueryModel::index(index.row(), 0);
    QString sId = data(pkIndex).toString();
    if(index.column() == 1)//姓名
    {
        QSqlQuery query;
        query.prepare("UPDATE Person SET name = :name WHERE id = :id");
        query.bindValue(":name",value.toString());
        query.bindValue(":id",sId);
        bool isOk = query.exec();
 
 
        setQuery("select * from Person");
        setHeaderData(0, Qt::Horizontal, "id");
        setHeaderData(1, Qt::Horizontal, "name");
        setHeaderData(2, Qt::Horizontal, "telephone");
 
 
    }
    else {
        QSqlQuery query;
        query.prepare("UPDATE Person SET telephone = :telephone WHERE id = :id");
        query.bindValue(":telephone",value.toString());
        query.bindValue(":id",sId);
        bool isOk = query.exec();
 
 
        setQuery("select * from Person");
        setHeaderData(0, Qt::Horizontal, "id");
        setHeaderData(1, Qt::Horizontal, "name");
        setHeaderData(2, Qt::Horizontal, "telephone");
    }
}
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QString spath = QDir::currentPath()+"/MyDataBasetest.db";
    QFile f(spath);
    bool is = f.exists(spath);
    if(!is)
    {
        m_database = QSqlDatabase::addDatabase("QSQLITE");
        m_database.setDatabaseName("MyDataBasetest.db");
        m_database.setUserName("zbl");
        m_database.setPassword("123456");
        m_database.open();
        QString sql = QString("create table Person(id int primary key,  name varchar(30), telephone varchar(13) not null)");
        QSqlQuery query(m_database);
        bool isSuccess = query.exec(sql);
        if(!isSuccess)
        {
            m_database.close();
            m_database.removeDatabase("zbl2");
            return;
        }
 
 
         query.prepare("insert into Person(id, name, telephone) values (?, ?, ?)");
 
 
         QVariantList ids;
         ids<< QUuid::createUuid().toString()<< QUuid::createUuid().toString()<< QUuid::createUuid().toString()<< QUuid::createUuid().toString();
          query.addBindValue(ids);
         QVariantList nameList;
         nameList << "张三" << "李四" << "王五" << "小6";
         query.addBindValue(nameList);
 
 
         QVariantList telp;
         telp << "123" << "134" << "125" << "192";
         query.addBindValue(telp);
 
 
         if (!query.execBatch())
         {
             qDebug() << query.lastError();
         }
 
 
    }
    else {
        m_database = QSqlDatabase::addDatabase("QSQLITE");
        m_database.setDatabaseName("MyDataBasetest.db");
        m_database.setUserName("zbl");
        m_database.setPassword("123456");
        m_database.open();
    }
   m_database.open();
   MysqlQueryModel *Model = new MysqlQueryModel;
   Model->setQuery("select *from Person");
   Model->setHeaderData(0, Qt::Horizontal, "id");
   Model->setHeaderData(1, Qt::Horizontal, "name");
   Model->setHeaderData(2, Qt::Horizontal, "telephone");
 
 
//   QSqlTableModel *Model = new QSqlTableModel(this, m_database);
//    Model->setTable("Person");
//    Model->select();
//    Model->removeColumn(0);
//   /Model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    QTableView *view = new QTableView(this);
    QStandardItem *item = new QStandardItem();
 
 
  //  view->setSelectionMode(item);
 
 
   // view->setEditTriggers(QAbstractItemView::DoubleClicked);
 
 
    view->setModel(Model);
    QItemSelectionModel *selection = new  QItemSelectionModel(Model);
    view->setSelectionModel(selection);
    connect(selection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), view, SLOT(selectionChanged(QItemSelection,QItemSelection)));
 
 
    //view->resizeColumnsToContents();
    view->show();
    view->resize(this->size());
}
 
 
Widget::~Widget()
{
 
 
}
 
 


widget.h文件如下:

#ifndef WIDGET_H
#define WIDGET_H
 
 
#include <QWidget>
#include <QSqlDatabase>
#include <QItemSelection>
#include <QSqlQueryModel>
class Widget : public QWidget
{
    Q_OBJECT
 
 
public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QSqlDatabase m_database;
 
 
public slots:
 
 
};
 
 
class MysqlQueryModel:public QSqlQueryModel
{
    Q_OBJECT
public:
    explicit MysqlQueryModel(QObject *parent = Q_NULLPTR);
    virtual ~MysqlQueryModel();
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
 
 
    Qt::ItemFlags flags(const QModelIndex &index) const;
};
 
 
#endif // WIDGET_H
 
 

猜你喜欢

转载自blog.csdn.net/qq_16628589/article/details/79936184
今日推荐