Loop über Widgets im PyQt Layout

Meine Frage ist etwas verwandt mit Get a layout's Widgets in PyQT aber es ist kein Duplikat. Anstatt auf der Suche nach einem hochrangigen strategischen Blick auf, wie es zu tun ist, versuche ich zu verstehen, was die idiomatischste und einfachste Art, es zu tun wäre. Da PyQt eine ziemlich genaue Bindung der Qt C ++ API ist, präsentiert es einen C-ish Weg, um an Widgets in einem Layout zu bekommen. Hier ist die Art von Idiom, die ich benutzt habe:

for i in range(layout.count()): item = layout.itemAt(i) if type(item) == QtGui.QLayoutItem: doSomeStuff(item.layout()) if type(item) == QtGui.QWidgetItem: doSomething(item.widget()) 

Ich bin nicht der erfahrenste Python-Typ, aber das scheint etwas unpythonisch. Meine Intuition sagt mir, dass in einer idealen Welt der Python-Code etwas ähnlicher aussehen sollte:

 for w in layout.widgets(): doSomething(w) 

Liege ich falsch? Bin ich ein überlegenes Idiom? Ist dies der beste Weg, um über Widgets in PyQt zu iterieren? Ich neige dazu, in C ++ zu denken, also vermisse ich manchmal "offensichtliche" Python-Sprachmerkmale, die die Dinge besser machen. Ein Teil von dem, was ich tue, ist rekursiv absteigend in Widgets mit Layouts mit Widgets mit Layouts (etc …), um automatisch Draht Verbindungen zu UI's in Designer zur Laufzeit gemacht. Fügen Sie in QTabWidgets, und die Behandlung der dynamischen Eigenschaften in Designer gesetzt, und mein Code im Grunde funktioniert, aber es fühlt sich einfach schrecklich klobig.

4 Solutions collect form web for “Loop über Widgets im PyQt Layout”

Du könntest die Widgets wie folgt in einen Generator stellen:

 items = (layout.itemAt(i) for i in range(layout.count())) for w in items: doSomething(w) 

Wenn Sie am Ende mit dem viel, können Sie diesen Code in eine Generator-Funktion socken:

 def layout_widgets(layout): return (layout.itemAt(i) for i in range(layout.count())) for w in layout_widgets(layout): doSomething(w) 

Dies ist eine sehr späte Antwort, aber ich dachte, es könnte nützlich sein für zukünftige Wiederaufnahme. Ich war auf der Suche nach der Antwort auf diese Frage auch. Aber ich wollte Widget-Typen identifizieren, damit ich sie entsprechend behandeln konnte. Hier ist Beispielcode von dem, was ich gefunden habe:

 for widget in centralwidget.children(): if isinstance(widget, QLineEdit): print "linedit: %s - %s" %(widget.objectName(),widget.text()) if isinstance(widget, QCheckBox): print "checkBox: %s - %s" %(widget.objectName(),widget.checkState()) 

Ich hoffe das wird für jemanden nützlich sein. 🙂

Nur ein Kommentar,

 items = (layout.itemAt(i) for i in range(layout.count())) for w in items: doSomething(w) 

Ich habe die erste Antwort versucht, aber ich habe festgestellt, dass es einen WidgetItem-Typ zurückgibt, also habe ich eigentlich eine Revision gemacht:

 widgets = (layout.itemAt(i).widget() for i in range(layout.count())) for w in widgets: if isinstance(widget, QLineEdit): print "linedit: %s - %s" %(widget.objectName(),widget.text()) if isinstance(widget, QCheckBox): print "checkBox: %s - %s" %(widget.objectName(),widget.checkState()) 

Ich glaube, Sie haben schon die einfachste Lösung für dieses Problem. PyQt (und PySide) sind meist nur Wrapper um die C ++ API. Sie fügen mehr pythonische Unterstützung in einigen Bereichen hinzu – Signale / Slots, Basistypen wie QString, etc. aber zum größten Teil ist alles genau so wie es in der C ++ API ist.

Natürlich, das muss dich nicht davon abhalten, deine eigenen mehr pythonischen Bibliothek zu machen.

  • Sollte der Platzhalterimport vermieden werden?
  • Übergeben eines Arguments beim Starten von neuem QThread () in PyQt
  • Starten Sie ein PyQT-Fenster aus einem Haupt-PyQt-Fenster und erhalten Sie die Benutzereingabe?
  • PyQt4 und 64-Bit-Python
  • PyQt: moveToThread funktioniert nicht bei der Verwendung von partial () für Slot
  • Verwenden eines QThread in PyQT für serielle Kommunikation (mit pyserial)
  • Kratzen Sie mehrere URLs mit QWebPage
  • PyQtGraph-Gitter mit verknüpften Achsen
  • Fortschrittsleiste mit pyqt
  • Wie kann ich die Funktion einer Seite mit der nächsten Schaltfläche eines Qwizards verbinden?
  • PyQt zu verhindern, dass Ausnahmen in Slots auftreten
  • Python ist die beste Programmiersprache der Welt.