Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible d'afficher les données de QSqlQueryModel dans un QML TableView

Ok, votre commentaire m'a rappelé que vous devez en effet réimplémenter data() pour le modèle de QML. Pourquoi? Parce que le modèle de QML appelle data() avec les rôles donnés par roleName(). Il n'appelle pas data() avec Qt::DisplayRole comme dans le monde QWidget. De plus, vous devez définir TableViewColumn avec des noms de rôle, sinon le modèle n'appellera pas data() . Voici un exemple de la façon dont vous pouvez réimplémenter data() :

import sys
from PyQt5.QtCore import QUrl, Qt, QVariant
from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQuick import QQuickView
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel

class QtTabModel(QSqlQueryModel):
    def __init__(self):
        super(QtTabModel, self).__init__()

    def roleNames(self):
        roles = {
            Qt.UserRole + 1 : 'id',
            Qt.UserRole + 2 : 'name'
        }
        return roles

    def data(self, index, role):
        if role < Qt.UserRole:
            # caller requests non-UserRole data, just pass to papa
            return super(QtTabModel, self).data(index, role)

        # caller requests UserRole data, convert role to column (role - Qt.UserRole -1) to return correct data
        return super(QtTabModel, self).data(self.index(index.row(), role - Qt.UserRole -1), Qt.DisplayRole)

    @pyqtSlot(result=QVariant)  # don't know how to return a python array/list, so just use QVariant
    def roleNameArray(self):
        # This method is used to return a list that QML understands
        list = []
        # list = self.roleNames().items()
        for key, value in self.roleNames().items():
            list.append(value)

        return QVariant(list)

Ajouter TableViewColumn à TableView . Gardez à l'esprit que les rôles sont sensibles à la casse. Ils doivent correspondre exactement à ce que roleNames() renvoie :

import QtQuick 2.2
import QtQuick.Controls 1.1

TableView {
    width: 200
    height: 300
    model: tabmodel
    TableViewColumn {
        role: "id" // case-sensitive, must match a role returned by roleNames()
    }
    TableViewColumn {
        role: "name"
    }

}

Voici un moyen de générer automatiquement TableViewColumn. Il appelle l'emplacement roleNameArray défini dans le code python ci-dessus pour obtenir la liste des noms de rôles. Nous n'appelons pas roleNames() ici car je ne sais pas comment faire comprendre à QML le résultat qu'il renvoie :), nous devons donc le convertir en liste. Enfin, nous parcourons la liste et appelons TableView.addColumn pour créer des colonnes :

TableView {
    width: 200
    height: 300
    model: tabmodel
    Component.onCompleted: {
        var roles = model.roleNameArray()
        for (var i=0; i<roles.length; i++) {
          var column = addColumn( Qt.createQmlObject(
            "import QtQuick.Controls 1.1; TableViewColumn {}",
            this) )
          column.role = roles[i]
          column.title = roles[i]
        }
    }

}