Добре, коментарът ви ми напомни, че наистина трябва да приложите отново 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]
}
}
}