sql >> Database >  >> RDS >> Mysql

Kan geen gegevens van QSqlQueryModel weergeven in een QML TableView

Ok, je opmerking herinnerde me eraan dat je inderdaad data() opnieuw moet implementeren omwille van het model van QML. Waarom? Omdat het model van QML data() . aanroept met de rollen gegeven door roleName(). Het roept data() . niet aan met Qt::DisplayRole zoals in de QWidget-wereld. Verder moet u TableViewColumn . definiëren met rolnamen, anders roept het model data() . niet aan . Hier is een voorbeeld van hoe u data() opnieuw kunt implementeren :

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)

TableViewColumn toevoegen naar TableView . Houd er rekening mee dat rollen hoofdlettergevoelig zijn. Ze moeten exact overeenkomen met wat roleNames() retourneert:

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

}

Hier is een manier om automatisch TableViewColumn te genereren. Het roept roleNameArray-slot aan dat is gedefinieerd in de python-code hierboven om de lijst met rolnamen te krijgen. We noemen hier geen roleNames() omdat ik niet weet hoe ik QML het resultaat moet laten begrijpen dat het retourneert :), dus we moeten het naar een lijst converteren. Ten slotte doorlopen we de lijst en roepen we TableView.addColumn op om kolommen te maken:

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

}



  1. postgreSQL - in vs any

  2. Efficiënt een feed maken van meerdere railsmodellen?

  3. mysql-achtig probleem bij gedeeltelijke overeenkomst

  4. Index voor het vinden van een element in een JSON-array