如何在qsqlqueryModel(QAbstractItemModel)中编写setdata()
how to write setdata() in qsqlquerymodel(QAbstractItemModel)?
我使用继承(QSqlQueryModel
(和我做了myModel
在其中插入列。我想插入 QString
类型的数据,但我不知道该怎么做。
QSQlQueryModel
是只读模型。要使其读写,您必须对其进行子类化并重新实现setData()
和flags()
。
我想覆盖这两个方法,这是我到目前为止所做的:
对话框.cpp:
this->model = new myModel(this);
model->setQuery("SELECT * lists");
model->insertColumn(3);
model->setHeaderData(3, Qt::Horizontal, QObject::tr("string"));
qDebug() << model->setData(model->index(0,3),"string",Qt::EditRole);
// column add, column set data using setdata()
ui->tvGameList->setModel(model);
myModel.h:
class myModel : public QSqlQueryModel
{
Q_OBJECT
public:
myModel(QObject *parent = 0);
Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
bool setData(const QModelIndex &index, const QVariant &value, int role) Q_DECL_OVERRIDE;
};
我的型号.cpp:
#include "mymodel.h"
#include <QSqlQuery>
myModel::myModel(QObject *parent): QSqlQueryModel(parent)
{
}
Qt::ItemFlags myModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable;
return flags;
}
bool myModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
{
if (index.isValid() && role == Qt::EditRole)
{
// I don't know here
emit dataChanged(index, index);
return true;
}
return false;
}
参见Qt示例,setData必须像通常SQL一样调用SQL UPDATE语句。
Qt::ItemFlags EditableSqlModel::flags(
const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable;
return flags;
}
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
if (index.column() < 1 || index.column() > 2)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
clear();
bool ok;
if (index.column() == 1) {
ok = setFirstName(id, value.toString());
} else {
ok = setLastName(id, value.toString());
}
refresh();
return ok;
}
bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
QSqlQuery query;
query.prepare("update person set firstname = ? where id = ?");
query.addBindValue(firstName);
query.addBindValue(personId);
return query.exec();
}
相关文章:
- 为什么不能使用 setData() 在 QTreeView 中设置单元格的背景颜色?
- glTexSubImage3D vs QOpenGLTexture setData
- 从 QML 调用 QAbstractTableModel setData 方法
- :void setData(const Color * & data_ptr)中的 *& 是什么意思;
- QSqlTableModel::setData() 也使用 Qt::EditMode 返回 false
- setData returns false for QAbstractProxyModel
- 如何在qsqlqueryModel(QAbstractItemModel)中编写setdata()
- 使用SetData()分配数据后,cvReleaseImage()出现分段错误
- setData() versus insertRows() Qt ModelView