QSQLTableModel继承者和QTableView

时间:2013-01-30 21:08:45

标签: qtableview qsqltablemodel

我编写了QSQLTableModel继承器来处理qml,它运行良好。我需要将它与QTableView一起使用,数据显示,但我无法修改它 - 当我编辑一切都没问题,但是当我从现场离开时所有的变化都会下降(我知道editStrategy,但问题发生在前面)。我认为虚函数出了问题,但是我不知道是什么。如果我使用相同的参数创建QSqlTableModel,一切都很好。有人知道我该如何解决这个问题?我的代码:

H:

class ListModel : public QSqlTableModel
{

    Q_OBJECT
    Q_PROPERTY( int count READ rowCount() NOTIFY countChanged())

signals:
    void countChanged();

public:
    Q_INVOKABLE QVariant data(const QModelIndex &index, int role) const;
    ListModel(QObject *parent, QSqlDatabase _db):QSqlTableModel(parent,_db){this->setEditStrategy(QSqlTableModel::OnManualSubmit);}
    void applyRoles();
#ifdef HAVE_QT5

virtual QHash<int, QByteArray> roleNames() const{return roles;}

#endif

private:
    int count;
    QHash<int, QByteArray> roles;
};

CPP:

//based on http://qt-project.org/wiki/How_to_use_a_QSqlQueryModel_in_QML

void ListModel::applyRoles()
{
    roles.clear();
    qDebug()<<"\n"<<this->tableName();
    for (int i = 0; i < this->columnCount(); i++) {
            QString role=this->headerData(i, Qt::Horizontal).toString();
            roles[Qt::UserRole + i + 1] = QVariant(role).toByteArray();
            qDebug()<<this->headerData(i, Qt::Horizontal);
    }
#ifndef HAVE_QT5
    setRoleNames(roles);
#endif
}

QVariant ListModel::data(const QModelIndex &index, int role) const{

    QVariant value;
    if(role < Qt::UserRole)
    {
        value = QSqlQueryModel::data(index, role);
    }
    else {
        int columnIdx = role - Qt::UserRole - 1;
        QModelIndex modelIndex = this->index(index.row(), columnIdx);
        value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
    }
    return value;
}

UPD 我明白问题出在data方法的量词const中,如果我删除它,QTableView的一切都没问题,但是我无法通过gml的listviews从模型中获取数据。我只看到一个解决方案 - 用QSqlTableModel替换interition并将其聚合,但也许有人知道更好的解决方案?

1 个答案:

答案 0 :(得分:2)

总结:解决了奇怪的黑客 - 继承自QSqlRelationalTableModel而不是QSqlTableModel,我认为原因是QSqlRelationalTableModel已经重写了非虚方法数据