首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用qsqlquerymodel(QAbstractItemModel)编写setdata()?

如何用qsqlquerymodel(QAbstractItemModel)编写setdata()?
EN

Stack Overflow用户
提问于 2015-11-18 13:27:55
回答 1查看 2.8K关注 0票数 1

我使用myModel继承 (QSqlQueryModel)制作了,并将列插入其中。我想要插入QString类型的数据,但是我不知道该如何做。

QSQlQueryModel是只读模式.要使其读写,必须对其进行子类化,并重新实现setData()flags().

我想重写这两个方法,下面是我迄今为止所做的工作:

dialog.cpp:

代码语言:javascript
复制
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.h:

代码语言:javascript
复制
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;

};

myModel.cpp:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-11-19 04:06:15

参见Qt示例,setData必须像通常的SQL一样调用setData状态。

代码语言:javascript
复制
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();
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33781346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档