Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile visualizzare i dati da QSqlQueryModel in un QML TableView

Ok, il tuo commento mi ha ricordato che devi davvero reimplementare data() per il bene del modello di QML. Come mai? Perché il modello di QML chiama data() con i ruoli forniti da roleName(). Non chiama data() con Qt::DisplayRole come nel mondo QWidget. Inoltre, devi definire TableViewColumn con i nomi dei ruoli, altrimenti il ​​modello non chiamerà data() . Ecco un esempio di come puoi reimplementare 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)

Aggiungi TableViewColumn a TableView . Tieni presente che il ruolo fa distinzione tra maiuscole e minuscole. Devono corrispondere esattamente a ciò che roleNames() restituisce:

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"
    }

}

Ecco un modo per generare automaticamente TableViewColumn. Chiama lo slot roleNameArray definito nel codice Python sopra per ottenere l'elenco dei nomi dei ruoli. Non chiamiamo roleNames() qui poiché non so come far capire a QML il risultato che restituisce :), quindi dobbiamo convertirlo in un elenco. Infine, scorriamo l'elenco e chiamiamo TableView.addColumn per creare colonne:

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]
        }
    }

}