[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