J'ai une base de donnée, chargée dans une classe dérivée de QSQLTableModel.
Chaque colonne correspond à un "role" dans le model et toutes les données s'affichent bien grâce aux roles name coté qml.
Maintenant je veux ajouter un nouveau role pour chaque data, comme si j'ajoutais une nouvelle colonne à la base de donnée, mais ça ne fonctionne pas, j'obtiens "undefined" quand j'essaie d'afficher cette nouvelle donnée.
// Voici la partie où j'ajoute le nouveau role
auto rec = record();
for(int i = 0; i < rec.count(); i++) {
m_roles.insert(Qt::UserRole + i + 1, rec.fieldName(i).toUtf8());
}
m_roles.insert(Qt::UserRole + rec.count() + 1, "subgame"); // extra role
select();
insertColumn(columnCount()); // J'ajoute une colonne "à la fin"
J'ai redéfini columnCount pour prendre en compte la nouvelle colonne
Les fonctions data et setData redéfinies (l'index de la colonne est recalculé grâce à role - Qt::UserRole - 1, ce qui donnera une valeur entre 0 et columnCount() - 1)
QVariant SqlTableModel::data(const QModelIndex &index, int role) const
{
if (index.isValid()) {
if (role >= Qt::UserRole) {
int columnIdx = role - Qt::UserRole - 1;
QModelIndex modelIndex = this->index(index.row(), columnIdx);
return QSqlTableModel::data(modelIndex, Qt::DisplayRole);
}
}
return QSqlTableModel::data(index, role);
}
bool SqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid()) {
if (role >= Qt::UserRole) {
int columnIdx = role - Qt::UserRole - 1;
QModelIndex modelIndex = this->index(index.row(), columnIdx);
return QSqlTableModel::setData(modelIndex, value, Qt::EditRole);
}
}
return QSqlTableModel::setData(index, value, role);
}
Et voici la fonction qui ajoute des valeurs à cette nouvelle colonne :
Je passe bien dans les fonctions "setData" avec "true" ou "false", mais quand je veux recupérer la valeur avec "data", j'ai systématiquement "false", et coté qml j'ai donc "undefined".
Des pistes ?
- Edité par Palador 4 avril 2024 à 22:56:42
Qt QSqlTableModel - Ajouter une colonne virtuelle
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.