没有破解就无法获得在 PySide2 上工作的 QAbstractListModel 子类
Cannot get a QAbstractListModel subclass working on PySide2 without a hack
使用正在进行中的 PySide2(以便能够使用 Qt5),我有以下代码:
main.qml:
import QtQuick 2.0
import QtQuick.Controls 1.3
ApplicationWindow {
visible: true
ListView {
width: 100
height: 100
model: listModel
delegate: Text {
text: model.name
}
}
}
main.py:
from sys import argv, exit
from PySide2.QtCore import QAbstractListModel
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class TaskListModel(QAbstractListModel):
_COLUMNS = ('name',)
def data(self, index, role):
if role == self._COLUMNS.index('name'):
return str(index.row())
return None
def roleNames(self):
return dict(enumerate(self._COLUMNS))
def rowCount(self, parent):
return 1
app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('listModel', None)
engine.load('main.qml')
engine.rootContext().setContextProperty('listModel', TaskListModel())
exit(app.exec_())
在 main.py 末尾对 engine
对象的 3 个方法调用是这样的,因为:
我得到 Unable to assign [undefined] to QString
如果我使用:
engine.rootContext().setContextProperty('listModel', TaskListModel())
engine.load('main.qml')
我得到 ReferenceError: listModel is not defined
如果我使用:
engine.load('main.qml')
engine.rootContext().setContextProperty('listModel', TaskListModel())
我的方法是正确执行此操作的唯一方法吗?我上面第一个项目符号中的代码不应该也有效吗?
如果将 PySide2
分配给某个变量,它似乎会从内存中删除 TaskListModel()
,我找到了 2 个解决方案:
- 创建一个存储模型的变量:
app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
model = TaskListModel()
engine.rootContext().setContextProperty('listModel', model)
engine.load('main.qml')
exit(app.exec_())
- 将父项传递给模型:
app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('listModel', TaskListModel(engine))
engine.load('main.qml')
exit(app.exec_())
使用正在进行中的 PySide2(以便能够使用 Qt5),我有以下代码:
main.qml:
import QtQuick 2.0
import QtQuick.Controls 1.3
ApplicationWindow {
visible: true
ListView {
width: 100
height: 100
model: listModel
delegate: Text {
text: model.name
}
}
}
main.py:
from sys import argv, exit
from PySide2.QtCore import QAbstractListModel
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class TaskListModel(QAbstractListModel):
_COLUMNS = ('name',)
def data(self, index, role):
if role == self._COLUMNS.index('name'):
return str(index.row())
return None
def roleNames(self):
return dict(enumerate(self._COLUMNS))
def rowCount(self, parent):
return 1
app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('listModel', None)
engine.load('main.qml')
engine.rootContext().setContextProperty('listModel', TaskListModel())
exit(app.exec_())
在 main.py 末尾对 engine
对象的 3 个方法调用是这样的,因为:
我得到
Unable to assign [undefined] to QString
如果我使用:engine.rootContext().setContextProperty('listModel', TaskListModel()) engine.load('main.qml')
我得到
ReferenceError: listModel is not defined
如果我使用:engine.load('main.qml') engine.rootContext().setContextProperty('listModel', TaskListModel())
我的方法是正确执行此操作的唯一方法吗?我上面第一个项目符号中的代码不应该也有效吗?
如果将 PySide2
分配给某个变量,它似乎会从内存中删除 TaskListModel()
,我找到了 2 个解决方案:
- 创建一个存储模型的变量:
app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
model = TaskListModel()
engine.rootContext().setContextProperty('listModel', model)
engine.load('main.qml')
exit(app.exec_())
- 将父项传递给模型:
app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('listModel', TaskListModel(engine))
engine.load('main.qml')
exit(app.exec_())