[PyQt] Python3.4 + PyQt5 QML ListView - Cannot add entries
Sylvie
iamsylvie at openmailbox.org
Mon Dec 21 21:06:08 GMT 2015
With the help of Avaris on #pyqt, I have figured it out. I find it hard
to explain what was changed, but I will put the complete code here, as
it may help someone. Thanks again, Avaris!
main.py:
#!/usr/bin/python3
import sys
import os
from os.path import expanduser
from subprocess import call
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.Qt import *
from PyQt5.QtQuick import *
class ViewModel():
def __init__(self):
self.getPasswords()
self.filteredPasswordList = self.passwordList
self.listViewModelPasswordList =
QStringListModel(self.filteredPasswordList)
def bindListView(self, listView):
self.listView = listView
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):
self.filteredPasswordList = [];
searchString = text.lower()
for password in self.passwordList:
if searchString in password.lower():
self.filteredPasswordList.append(password)
QQmlProperty.write(self.listView, "model",
QStringListModel(self.filteredPasswordList))
def select(self):
if len(self.filteredPasswordList) == 0: return
exit(call(["pass", "-c", self.filteredPasswordList[0]]))
class Window(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.engine = QQmlApplicationEngine(self)
self.vm = ViewModel()
self.engine.rootContext().setContextProperty("listViewModel",
self.vm.listViewModelPasswordList)
self.engine.load(QUrl.fromLocalFile(os.path.dirname(os.path.realpath(__file__))
+ "/main.qml"))
self.window = self.engine.rootObjects()[0]
searchInput = self.window.findChild(QObject, "searchInput")
resultList = self.window.findChild(QObject, "resultList")
self.vm.bindListView(resultList)
searchInput.textChanged.connect(lambda:
self.vm.search(QQmlProperty.read(searchInput, "text")))
searchInput.accepted.connect(self.vm.select)
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 {
objectName: "scrollView"
Layout.fillHeight: true
Layout.fillWidth: true
ListView {
objectName: "resultList"
model: listViewModel
delegate: Text { text: display }
Layout.fillHeight: true
Layout.fillWidth: true
}
}
}
}
On 21/12/15 19:44, Sylvie wrote:
> Hello Phil,
>
> Keeping a reference indeed prevents the segmentation fault, but
> unfortunately the ListView still does not get populated. Still a helpful
> pointer, though.
>
> - Sylvie
>
> On 21/12/15 19:39, Phil Thompson wrote:
>> You might want to try keeping a reference to the QStringListModel.
>>
>> Phil
>>
> _______________________________________________
> PyQt mailing list PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
More information about the PyQt
mailing list