Я пытаюсь использовать PySide для обновления ListView в QML на основе данных из файла CSV.Файл CSV обновляется внешней программой, поэтому у меня есть цикл, настроенный для извлечения данных из этого файла в цикле.
Я могу получить данные в Python и распечатать их, но я думаю,моя ошибка - проблема сигнала / слота, и она просто не обновляется в QML.
main.py:
def importSimStatus(statusOutput):
with open(r'status output.csv','r') as readFile:
dummyList2 = statusOutput.outputStatus
i = 0
for j in range(8):
statusOutput.setOutputStatus("", j)
csvReader = csv.reader(readFile)
for row in csvReader:
statusOutput.setOutputStatus(row[0], i)
dummyList2 = statusOutput.outputStatus
i += 1
def checkSimOutput():
for out in range(8):
statusOutput.setOutputStatus("", out)
simResults = []
dummyList = statusOutput.outputStatus
while (dummyList[7] == ""):
try:
importSimStatus(statusOutput)
except:
pass
time.sleep(1)
print(statusOutput.outputStatus)
class CheckSimOutput(QRunnable):
def run(self):
checkSimOutput()
class OutputData(QObject):
statusSig = Signal(list)
def __init__(self, parent=None):
QObject.__init__(self, parent)
self.m_outputStatus = []
def resizeOutputStatus(self, i):
for x in range(i):
self.m_outputStatus.append("")
@Property(list, notify=statusSig)
def outputStatus(self):
return self.m_outputStatus
@outputStatus.setter
def setOutputStatus(self, text, i):
if self.m_outputStatus[i] == text:
return
self.m_outputStatus[i] = text
self.statusSig.emit(self.m_outputStatus)
class Settings(QObject):
simWorkAround = Signal(int)
def __init__(self, parent=None):
QObject.__init__(self, parent)
self.m_simWorkAround = 0
@Property(int, notify=simWorkAround)
def simWorkaround(self):
return self.m_simWorkAround
@simWorkaround.setter
def setSimWorkaround(self, num):
if self.m_simWorkAround == num:
return
self.m_simWorkAround = num
self.simWorkAround.emit(self.m_simWorkAround)
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
settings = Settings()
statusOutput = OutputData()
statusOutput.resizeOutputStatus(8)
def simThread():
simOutRunnable = CheckSimOutput()
QThreadPool.globalInstance().start(simOutRunnable)
model = QStringListModel()
model.setStringList(statusOutput.outputStatus)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("settings", settings)
engine.rootContext().setContextProperty("myModel", model)
engine.load(QUrl.fromLocalFile('mainfile.qml'))
if not engine.rootObjects():
sys.exit(-1)
settings.simWorkAround.connect(simThread)
statusOutput.statusSig.connect(model.setStringList(statusOutput.outputStatus))
sys.exit(app.exec_())
mainfile.qml:
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.1
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Main Program")
Button {
text: qsTr("Start Draft")
anchors.top: parent.top
anchors.topMargin: 21
anchors.horizontalCenterOffset: 0
anchors.horizontalCenter: parent.horizontalCenter
onClicked: settings.simWorkaround = settings.simWorkaround + 1
}
ListView{
id: listView
x: 0
width: 200
height: 150
anchors.top: parent.top
anchors.topMargin: 55
anchors.horizontalCenter: parent.horizontalCenter
contentWidth: 0
model: myModel
//anchors.fill: parent
delegate: Text { text: model.display }
}
}
Asзаявил, что я могу получить список для печати после того, как он будет импортирован из CSV-файла.Я также могу «предварительно загрузить» список, добавив элементы вроде этого:
statusOutput.setOutputStatus("foo",0)
statusOutput.setOutputStatus("bar",1)
И, опередив «engine.rootContext (). SetContextProperty (« myModel », model)», я могу увидеть список«foo» и «bar», но ничего не происходит при нажатии моей кнопки для запуска циклов.
Как мне обновить ListView при обновлении statusOutput?