While trying to display data from QSQLITE table in QML TableView I stumbled upon this answer and tried to follow up with it. I understood necessity of re implementing data() and roleNames() but I have problem when it comes to QVariant which is not present in PySide2. I get NameError: name 'QVariant' is not defined.
I have tested reading data from database , its working.
Is there any datatype that can be used instead of QVariant in PySide2?
My plan is to have multiple datasources from different tables.This Example uses setContextProperty, is it better practice in this case usage of qmlRegisterType ?
folder structure
├── ViewModel
│ └── QCond.py
├── Qml
│ └── Modellist.qml
└── qmlengine.py
qmlengine.py
import os
import sys
from PySide2.QtCore import QUrl, QStringListModel, QCoreApplication, Qt
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine, qmlRegisterType
from PySide2.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
from ViewModel.QCond import *
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("C:\\Users\\terao\\Documents\\ctmd\\CatData.db")
db.open()
qry = QSqlQuery()
qry=db.exec_("SELECT tip,s FROM uzad")
tabmodel = QtCond()
tabmodel.setQuery(qry)
engine.rootContext().setContextProperty("tabmodel", tabmodel)
engine.load(QUrl.fromLocalFile('Qml/Modellist.qml'))
if not engine.rootObjects():
sys.exit(-2)
sys.exit(app.exec_())
QCond.py
import sys
from PySide2 import QtCore, QtGui, QtQml
from PySide2.QtCore import QObject, Qt,Signal, Slot, QUrl, QStringListModel, QCoreApplication
import sqlite3
from PySide2.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
class QtCond(QSqlQueryModel):
def __init__(self):
super(QtCond, self).__init__()
def roleNames(self):
roles = {
Qt.UserRole + 1 : 'tip',
Qt.UserRole + 2 : 's'
}
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)
@QtCore.Slot(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(str(value))
return QVariant(list)
Modellist.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls 2.5
TableView {
width: 1000
height: 1000
model: tabmodel
TableViewColumn {
role: "tip" // case-sensitive, must match a role returned by roleNames()
}
TableViewColumn {
role: "s"
}
}
Any help is appreciated. Thanks in advance.
