看大佬的相关博客发现 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