<p>OP希望数据库信息神奇地显示在视图中,而不必至少将该信息发送到.qml</p>
<p>另一方面,“displayCustomers.append(backend.getCount)”一行令人困惑,您打算如何处理该代码?在该代码中,getCount函数被添加到模型中,这显然是不合逻辑的</p>
<p>这个想法是要有一个模型(在python或QML中),该模型的角色与委托使用的角色相同,插槽应该只用于填充模型,在本例中,我将使用python模型</p>
<pre class="lang-py prettyprint-override"><code>import os
from pathlib import Path
import sys
import mysql.connector
from PySide2.QtCore import Property, QCoreApplication, QObject, Qt, QUrl, Slot
from PySide2.QtGui import QGuiApplication, QStandardItem, QStandardItemModel
from PySide2.QtQml import QQmlApplicationEngine
CURRENT_DIRECTORY = Path(__file__).resolve().parent
FIRSTNAME_ROLE = Qt.UserRole
LASTNAME_ROLE = Qt.UserRole + 1
AGE_ROLE = Qt.UserRole + 2
SEX_ROLE = Qt.UserRole + 3
class Backend(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._model = QStandardItemModel()
self._model.setItemRoleNames(
{
FIRSTNAME_ROLE: b"firstname",
LASTNAME_ROLE: b"lastname",
AGE_ROLE: b"age",
SEX_ROLE: b"sex",
}
)
self.add_row("Fistname", "LastName", "Age", "Sex")
def get_model(self):
return self._model
model = Property(QObject, fget=get_model, constant=True)
@Slot()
def loadFromDB(self):
self._model.clear()
db = mysql.connector.connect(
host="localhost", user="root", passwd="", database="test"
)
cursor = db.cursor()
cursor.execute("SELECT * FROM customer")
for row in cursor.fetchall():
firstname = row[0]
lastname = row[1]
age = row[2]
sex = row[3]
self.add_row(firstname, lastname, age, sex)
def add_row(self, firstname, lastname, age, sex):
item = QStandardItem()
item.setData(firstname, FIRSTNAME_ROLE)
item.setData(lastname, LASTNAME_ROLE)
item.setData(age, AGE_ROLE)
item.setData(sex, SEX_ROLE)
self._model.appendRow(item)
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
# Get Context
backend = Backend(app)
engine.rootContext().setContextProperty("backend", backend)
filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
url = QUrl.fromLocalFile(filename)
def handle_object_created(obj, obj_url):
if obj is None and url == obj_url:
QCoreApplication.exit(-1)
engine.objectCreated.connect(handle_object_created, Qt.QueuedConnection)
engine.load(url)
sys.exit(app.exec_())
</code></pre>
<p>main.qml</p>
<pre><code>import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
Window {
property var numberOfModels: 1
property var listofCust: []
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: listViewContainer
color: "pink"
anchors.fill: parent
Component {
id: customersDelegate
Row {
spacing: 50
Text {
text: firstname
}
Text {
text: lastname
}
Text {
text: age
}
Text {
text: sex
}
}
}
ListView {
anchors.fill: parent
anchors.bottomMargin: 52
model: backend.model
delegate: customersDelegate
}
Button {
id: btnShowList
x: 518
y: 440
text: qsTr("show list")
onClicked: {
backend.loadFromDB();
}
}
}
}
</code></pre>