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

Kan ikke vise data fra QSqlQueryModel i en QML TableView

Okay, din kommentar mindede mig om, at du faktisk skal genimplementere data() af hensyn til QML's model. Hvorfor? Fordi QML's model kalder data() med rollerne givet af roleName(). Den kalder ikke data() med Qt::DisplayRole ligesom i QWidget-verdenen. Desuden skal du definere TableViewColumn med rollenavne, ellers kalder modellen ikke data() . Her er et eksempel på, hvordan du kan genimplementere 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)

Tilføj TableViewColumn til TableView . Husk på, at der skelnes mellem store og små bogstaver i rollen. De skal matche nøjagtigt med, hvad roleNames() returnerer:

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

}

Her er en måde til automatisk at generere TableViewColumn. Det kalder roleNameArray slot defineret i python-koden ovenfor for at få rollenavnelisten. Vi kalder ikke roleNames() her, da jeg ikke ved, hvordan man får QML til at forstå resultatet, det returnerer :), så vi er nødt til at konvertere det til en liste. Til sidst går vi gennem listen og kalder TableView.addColumn for at oprette kolonner:

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. Hvorfor kommer resultater fra en SQL-forespørgsel ikke tilbage i den rækkefølge, jeg forventer?

  2. Kan jeg bruge en underforespørgsel i en INSERT-sætning?

  3. Sådan fjerner du to dublerede kolonner

  4. WinDeath på notifyDataSetChanged()