<p>如果有人在寻找答案,我做了一个小应用程序,用QAbstractListModel的子类连接到演员数据库,并根据@fgungor发布的示例在QGridView中显示缩略图</p>
<p><strong>主.py</strong>:</p>
<pre><code>import sys, models
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView
if __name__ == '__main__':
# Prints QML errors
def handleStatusChange(status):
if status == QQuickView.Error:
errors = appLabel.errors()
if errors:
print (errors[0].description())
myApp = QApplication(sys.argv)
appLabel = QQuickView()
appLabel.statusChanged.connect(handleStatusChange)
model = models.ActorModel(DB_PATH)
ctxt = appLabel.rootContext()
ctxt.setContextProperty('myModel', model)
appLabel.setSource(QUrl('./qml/main/main.qml'))
try:
sys.exit(myApp.exec_())
except:
print("Exiting")
</code></pre>
<p><strong>模型.py</strong>:</p>
^{2}$
<p><strong>数据库:</strong></p>
<pre><code>import sqlite3
class Database:
def __init__(self, db_path):
self.db_path = db_path
self.sqlite_db = sqlite3.connect(self.db_path)
self.sqlite_db.row_factory = sqlite3.Row
self.cursor = self.sqlite_db.cursor()
def actor_search(self, actor_name):
self.cursor.execute('SELECT Actors.Id,Actors.Name,Actors.thumbnail AS thumbnail FROM Actors '
'WHERE Actors.Name LIKE \'%{}%\' ORDER BY Actors.Name'.format(actor_name))
return self.cursor.fetchall()
</code></pre>
<p><strong>主.qml:</strong></p>
<pre><code>import QtQuick 2.8
import QtQuick.Window 2.2
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.1
Window {
id: root
visible: true
title: 'Actor Exploer'
width: 1280
height: 720
ColumnLayout {
id: mainLayout
anchors.fill: parent
Row {
Layout.fillWidth: true
TextArea {
id: searchBar
placeholderText: "Input actor name"
Layout.fillWidth: true
width: 600
onTextChanged: myModel.search_input(searchBar.text)
}
}
GridView {
id: gridView
keyNavigationWraps: true
Layout.fillWidth: true
Layout.fillHeight: true
cellWidth: 220
cellHeight: 320
model: myModel // QML connection to python model
delegate: Rectangle {
id: thumb_frame
height: 330
width: 200
Image {
id: actorThumb
asynchronous: true
source: "file:///" + thumb // Access to the ThumbRole in ActorModel in our python code
smooth: true
sourceSize.width: 200
sourceSize.height: 300
height: 300
width: 200
anchors.left: thumb_frame.left
anchors.top: thumb_frame.top
onStatusChanged: {
if (actorThumb.status == Image.Error)
actorThumb.source = 'PLACEHOLDER_IMAGE_PATH'
}
}
Text {
anchors.top: actorThumb.bottom
anchors.horizontalCenter: actorThumb.horizontalCenter
text: name // Access to the NameRole in ActorModel in our python code
}
}
}
}
</code></pre>