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.