1

qmlを操作するためのQSQLTableModel継承を作成しましたが、うまく機能します。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のリストビューを使用してモデルからデータを取得できません。解決策は1つしかありません。QSqlTableModelからのinteritionを集約に置き換えますが、誰かがより良い解決策を知っているでしょうか。

4

1 に答える 1

2

要約: 奇妙なハックで解決 - QSqlRelationalTableModel の代わりに QSqlRelationalTableModel から継承されました。その理由は、QSqlRelationalTableModel が非仮想メソッド データを書き換えたためだと思います

于 2013-02-04T21:14:56.297 に答える