ich bin neu hier im Forum. War bisher als stiller Beobachter hier schon öfters unterwegs und wurde einfach durch Suchen und Finden unterstützt. Doch jetzt habe ich ein Problem, bei dem ich auch mit Tante Google nicht weiter komme. Bin zwar in der Programmierwelt nicht ganz neu. Bisher lag mein Fokus allerdings eher auf VB.NET bzw. VBA, früher auch C++, aber das ist schon eine Ewigkeit her.. Da mir aber nun VBA einfach zu unflexibel ist (ja, habe eine große Schmerztoleranz ), arbeite ich mich in Python ein.
Randdaten: ich verwende Python 3.7.6, PyQt 5.14.1, PyQt5 sip 12.71, versch. IDEs (PyCharm, VSCode, IDLE (X), Eric6, QtCreator [hier mit PySide2])
Bitte keine Vorschläge, wie nimm doch ... o.ä. Mir geht es nicht um die schnellstmögliche, sondern einer angepassten Lösung, zu einem Problem, auf das ich hier nicht näher eingehe.
Ich möchte eine QComboBox oder auch QListView über eine von QAbstractListModel direkt oder indirekt abgeleitete Klasse füttern.
Einzig und allein ein unverändertes Objekt der QStringListModel-Klasse scheint im Stande zu sein, diese Aufgabe zu erfüllen. Zu meinem Zweck müsste ich aber die data()-Methode überschreiben. Und da fängt das Problem an: Die QComboBox wird zwar befüllt, aber das PopUp enthält keine Daten, wird auch nicht aufgeklappt. Über den Code mit setCurrentIndex() bzw. per Hoch-/Runtertaste kann ich den aktuellen Eintrag wählen. Ich kann auch per Text()-Methode alle Einträge auslesen, aber es wird kein PopUp angezeigt, aus dem der Anwender den entsprechenden Eintrag auswählen kann.
Das ListView bringt es noch eine Stufe heftiger: hier wird überhaupt gar nichts angezeigt. Ob es Einträge überhaupt speichert habe ich bisher aus lauter Verzweiflung noch gar nicht ausprobiert.
Hier mal der Code der zumindest Einträge darstellen lässt:
Code: Alles auswählen
from PyQt5 import QtCore as qtc
class myStringListModel(qtc.QStringListModel):
def __init__(self):
super().__init__(None)
self.setStringList([f"Eintrag {x}" for x in range(1, 11)])
def rowCount(self, parent):
ret = len(self.stringList())
return ret
Mit diesem Code wird die Anzahl der Einträge bereits festgesetzt, aber "natürlich" keine Einträge dargestellt.
Code: Alles auswählen
from PyQt5 import QtCore as qtc
class myStringListModel(qtc.QStringListModel):
def __init__(self):
super().__init__(None)
self.setStringList([f"Eintrag {x}" for x in range(1, 11)])
def rowCount(self, parent):
ret = len(self.stringList())
return ret
def data(self, index, role):
pass
Wenn ich nun die data()-Methode so abändere, dass auch sinnvolle Daten zurückgegeben werden, dann enthält das PopUp keine Einträge mehr (Änderungen kursiv dargestellt):
Code: Alles auswählen
from PyQt5 import QtCore as qtc
class myStringListModel(qtc.QStringListModel):
def __init__(self):
super().__init__(None)
self.setStringList([f"Eintrag {x}" for x in range(1, 11)])
def rowCount(self, parent):
ret = len(self.stringList())
return ret
def data(self, index, role):
try:
ret = self.stringList()[index.row()]
return ret
except IndexError:
return qtc.QVariant()
Olbob