如何将动态数据添加到 QML 表 [英] How to Add Dynamic Data to a QML Table
问题描述
我正在尝试从 Python 向表中添加行.我正在使用用 QML 描述的 TableView.
I'm trying to add rows to a table from Python. I'm using a TableView described with QML.
我不知道如何将模型添加到表中,除非模型也在 QML 中.但我不知道如何向模型添加值.
I can't figure out how to add a model to the table, unless the model is also in QML. But I can't figure out how to add values to the model.
import sys
from PyQt5.QtCore import QAbstractTableModel, QObject, QUrl
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtQuick import QQuickView
from PyQt5.QtWidgets import QApplication
myApp = QApplication(sys.argv)
engine = QQmlApplicationEngine()
context = engine.rootContext()
context.setContextProperty("main", engine)
engine.load('users.qml')
mainWin = engine.rootObjects()[0]
# Add items
userTable = mainWin.findChild(QObject, "userTable")
tableModel = mainWin.findChild(QObject, "libraryModel")
tableModel.setData(tableModel.index(0), "one")
tableModel.setData(tableModel.index(1), "one")
mainWin.show()
sys.exit(myApp.exec_())
users.qml
import QtQuick 2.3
import QtQuick.Controls 1.2
ApplicationWindow {
ListModel {
id: libraryModel
objectName: "libraryModel"
ListElement {
title: "A Masterpiece"
author: "Gabriel"
}
ListElement {
title: "Brilliance"
author: "Jens"
}
ListElement {
title: "Outstanding"
author: "Frederik"
}
}
TableView {
objectName: "userTable"
anchors.fill: parent
TableViewColumn {
role: "title"
title: "Title"
}
TableViewColumn {
role: "author"
title: "Author"
}
model: libraryModel
}
}
编辑
tableModel.append({'author': 'one', 'title': 'two'})
builtins.TypeError: unable to convert argument 0 of
QAbstractListModel.append from 'dict' to 'QQmlV4Function*'
推荐答案
由于没有人回答这个问题,我建议您使用一种解决方法:在 qml 中创建一个带有两个参数的 javascript 函数,并直接从 QML 文件将元素添加到表中.
Since nobody answered the question yet I will suggest you to use a workaround: Create a javascript function in qml with two arguments and add elements into to table right from QML file.
(显然你必须先从 python 调用函数,但那是小菜一碟......)
(Obviously you have to call the function from python first, but thats a piece of cake...)
附言如果您想展示示例,请在评论中告诉我:]
P.S. If you wanna show example let me know in comment :]
添加代码
import QtQuick 2.3
import MyApplication 1.0
QPythonBinding{
id: binding
signal addElement(string param1, string param2)
onAddElement: {
myModel.append({"key1" : param1, "key2" : param2})
}
}
现在是python代码
now python code
class QPythonBinding(QQuickItem):
def __init__(self, parent=None):
super(QPythonBinding, self).__init__(parent)
addElement = pyqtSignal(str, str) #you call it like this - addElement.emit("name", "value")
if __name__ == '__main__':
import sys
app = QGuiApplication(sys.argv)
qmlRegisterType(QPythonBinding, "MyApplication", 1, 0, "QPythonBinding")
view = QQuickView()
view.show()
app.exec_()
这篇关于如何将动态数据添加到 QML 表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!