Mysql
 sql >> база данни >  >> RDS >> Mysql

Не могат да се показват данни от QSqlQueryModel в QML TableView

Добре, коментарът ви ми напомни, че наистина трябва да приложите отново data() в името на модела на QML. Защо? Тъй като моделът на QML извиква data() с ролите, дадени от roleName(). Той не извиква data() с Qt::DisplayRole като в света на QWidget. Освен това трябва да дефинирате TableViewColumn с имена на роли, в противен случай моделът няма да извика data() . Ето пример за това как можете да внедрите повторно 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)

Добавете TableViewColumn към TableView . Имайте предвид, че ролите са чувствителни към главни букви. Те трябва да съвпадат точно с това, което roleNames() връща:

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

}

Ето начин за автоматично генериране на TableViewColumn. Той извиква слот roleNameArray, дефиниран в кода на Python по-горе, за да получи списъка с имена на роли. Тук не извикваме roleNames(), тъй като не знам как да накарам QML да разбере резултата, който връща :), така че трябва да го преобразуваме в списък. Накрая преминаваме през списъка и извикваме TableView.addColumn, за да създадем колони:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Многоезични полета в таблиците на БД

  2. Предимство от използването на Views в MySQL

  3. Календар за резервации Дати на пристигане и заминаване

  4. Възможно ли е да преместите запис от една таблица в друга с помощта на един SQL оператор?

  5. Как мога да задам сесия в базата данни codeigniter 3?