[PyQt] Python3.4 + PyQt5 QML ListView - Cannot add entries
Sylvie
iamsylvie at openmailbox.org
Mon Dec 21 18:20:05 GMT 2015
A small follow-up on this: The second time this function gets called,
print(QQmlProperty.read(resultListObject, "model"))
causes a Segmentation Fault.
On 21/12/15 17:08, Sylvie wrote:
> Hello everyone,
>
> I started a PyQt5 project a few days ago, but am currently stuck at
> trying to populate a QML ListView from my Python code.
>
> Right now, I use findChild to get the ListView with the objectName
> "resultList" from my QML and pass it along to a function, which works
> fine. However, the list remains empty after trying to add entries to it.
> Nothing is displayed, and the count remains 0.
>
> I have added some debug print statements to the relevant part my code,
> in the function which updates the resultList ListView:
> def updateResultList(self, resultListObject):
> print(QQmlProperty.read(resultListObject, "count"))
>
> print(self.filteredPasswordList)
>
> print(QQmlProperty.read(resultListObject, "model"))
> print(QQmlProperty.write(resultListObject, "model",
> QStringListModel(self.filteredPasswordList)))
> print(QQmlProperty.read(resultListObject, "count"))
>
>
> This prints the following:
> 0
> ['School/GitHub', 'Personal/FreePost', 'Personal/NotABug',
> 'Personal/Mail/List/RiverbankComputing']
> None
> True
> 0
>
> Currently, I feel that my mistake probably lies in writing to "model",
> but the Qt5 documentation says that "model" contains the list, and this
> is also what is used in the QML. Should I be writing to another property
> instead?
>
> For the sake of completion, my complete code is as follows:
>
> main.py:
>
> #!/usr/bin/python3
> import sys
> import os
> from os.path import expanduser
>
> from PyQt5.QtCore import *
> from PyQt5.QtWidgets import *
> from PyQt5.Qt import *
> from PyQt5.QtQuick import *
>
> class ViewModel():
> passwordList = [];
> filteredPasswordList = [];
>
> def __init__(self, resultListObject):
> self.getPasswords()
> self.filteredPasswordList = self.passwordList
> self.updateResultList(resultListObject)
>
> def getPasswords(self):
> self.passwordList = []
>
> passDir = expanduser("~") + "/.password-store/"
> for root, dirs, files in os.walk(passDir):
> for name in files:
> if name[0] == ".":
> continue
>
> self.passwordList.append(os.path.join(root,
> name)[len(passDir):-4])
>
> def search(self, text, resultListObject):
> self.filteredPasswordList = [];
> searchString = text.lower()
> for password in self.passwordList:
> if searchString in password.lower():
> self.filteredPasswordList.append(password)
>
> self.updateResultList(resultListObject)
>
> def updateResultList(self, resultListObject):
> print(QQmlProperty.read(resultListObject, "count"))
>
> print(self.filteredPasswordList)
>
> print(QQmlProperty.read(resultListObject, "model"))
> print(QQmlProperty.write(resultListObject, "model",
> QStringListModel(self.filteredPasswordList)))
> print(QQmlProperty.read(resultListObject, "count"))
>
> class Window(QDialog):
> def __init__(self, parent=None):
> super().__init__(parent)
>
> self.engine = QQmlApplicationEngine(self)
> self.engine.load(QUrl.fromLocalFile("main.qml"))
>
> self.window = self.engine.rootObjects()[0]
>
> searchInput = self.window.findChild(QObject, "searchInput")
> resultList = self.window.findChild(QObject, "resultList")
>
> self.vm = ViewModel(resultList)
>
> searchInput.textChanged.connect(lambda:
> self.vm.search(QQmlProperty.read(searchInput, "text"), resultList))
>
> def show(self):
> self.window.show()
>
> if __name__ == "__main__":
> app = QApplication(sys.argv)
> w = Window()
> w.show()
> sys.exit(app.exec_())
>
> main.qml:
>
> import QtQuick 2.2
> import QtQuick.Controls 1.4
> import QtQuick.Layouts 1.2
> import QtQuick.Window 2.1
>
> ApplicationWindow {
> title: 'PyPass'
> property int margin: 10
> width: 500
>
> x: (Screen.width - width) / 2
>
> flags: Qt.FramelessWindowHint | Qt.Window
>
> ColumnLayout {
> anchors.fill: parent
> anchors.margins: margin
> RowLayout {
> Layout.fillWidth: true
> TextField {
> objectName: "searchInput"
> font.pixelSize: 24
> focus: true
> Layout.fillWidth: true
> }
> }
> ScrollView {
> Layout.fillHeight: true
> Layout.fillWidth: true
> ListView {
> objectName: "resultList"
> Layout.fillHeight: true
> Layout.fillWidth: true
> }
> }
> }
> }
>
> Thank you in advance for your help!
> _______________________________________________
> PyQt mailing list PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
More information about the PyQt
mailing list