Được rồi, nhận xét của bạn nhắc nhở tôi rằng bạn thực sự cần thực hiện lại data()
vì lợi ích của mô hình QML. Tại sao? Vì mô hình của QML gọi data()
với các vai trò được cung cấp bởi roleName (). Nó không gọi data()
với Qt::DisplayRole
như trong thế giới QWidget. Hơn nữa, bạn cần xác định TableViewColumn
với tên vai trò, nếu không mô hình sẽ không gọi data()
. Đây là một ví dụ về cách bạn có thể thực hiện lại 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)
Thêm TableViewColumn
tới TableView
. Hãy nhớ rằng vai trò có phân biệt chữ hoa chữ thường. Chúng phải khớp chính xác với những gì roleNames () trả về:
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"
}
}
Đây là một cách để tự động tạo TableViewColumn. Nó gọi vị trí roleNameArray được xác định trong mã python ở trên để lấy danh sách tên vai trò. Chúng tôi không gọi roleNames () ở đây vì tôi không biết cách làm cho QML hiểu kết quả mà nó trả về :), vì vậy chúng tôi phải chuyển đổi nó thành một danh sách. Cuối cùng, chúng tôi lặp qua danh sách và gọi TableView.addColumn để tạo các cột:
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]
}
}
}