Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt QSqlTableModel - Ajouter une colonne virtuelle

Etendre les données de la base

    4 avril 2024 à 13:04:10

    Bonjour,

    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

    int SqlTableModel::columnCount(const QModelIndex &parent) const
    {
        return QSqlTableModel::columnCount(parent) + 1;
    }
    

    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 :

    void SqlTableModel::buildCodeMap()
    {
        QHash<QString, QStringList> hash;
    
        qDebug() << rowCount();
        for (int row = 0; row < rowCount(); ++row) {
            auto tag   = data(index(row, 0), Qt::UserRole + 1).toString(); // tag
            auto code = data(index(row, 0), Qt::UserRole + 6).toString(); // owned
    
            // qDebug() << tag << code;
            QRegularExpression regex("(.+?)(?:/|$)");
            QRegularExpressionMatch match = regex.match(code);
    
            if (match.hasMatch()) {
                QString numero = match.captured(1);
                hash[numero] << tag;
                if(hash[numero].count() > 1) {
                    setData(index(row, 0), true, Qt::UserRole + 9);
                } else {
                    setData(index(row, 0), false, Qt::UserRole + 9);
                }
            }
    
            qDebug() << data(index(row, 0), Qt::UserRole + 9).toBool(); // subgame
        }
        hash.removeIf([](QHash<QString, QStringList>::iterator i) {
            return i->count() == 1;
        });
    }

    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

    • Partager sur Facebook
    • Partager sur Twitter

    Qt QSqlTableModel - Ajouter une colonne virtuelle

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown