PyQt (oder QT nur). Wie kommt man QComboBox ein Signal zu feuern, wenn er auf einen Wert (auch wenn unverändert) gesetzt

StackOverflow https://stackoverflow.com/questions/3965093

  •  09-10-2019
  •  | 
  •  

Frage

Ich bin mit PyQt4, aber das ist allgemein genug, dass es nur zu QT Anwendung finden könnte.

Ich habe eine Reihe von QComboBoxes, dass ich von links nach rechts füllen (das heißt ein Element in der linken Auswahl wird die nächste füllen. Auswählen eines Objekts in diesem einen wird die nächste bevölkern, und so weiter)

Ich habe Schwierigkeiten, meine Signale zu Feuer unter allen Situationen (das heißt unabhängig davon, ob die aktuellen Indexänderungen oder nicht, und unabhängig davon, ob das Element durch den Benutzer oder eine Gruppe programmatisch festgelegt ist).

Weitere Einzelheiten:

Ich verlasse mich auf die Signale des ersten QCombox zu Feuer, wenn ein Element ausgewählt wird, so dass ich die nächste QCombobox in der gui bevölkern können. I stützen sich dann auf diesem QCombobox ein Signal auszusenden, so dass ich die nächste bevölkern können. Und so weiter.

Ich möchte ein Element in jedem QCombobox auf der letzten Interaktion des Benutzers basierend vorzuwählen mit der GUI.

Ich habe eine einzigartige Funktion pro QCombobox, die zum Bestücken und Vorauswahl verantwortlich ist nur, dass QCombobox. Der Code sieht etwa so aus:

comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)

Dabei gilt intLastSavedState1 eine ganze Zahl, die aus dem Text abgeleitet wird, die zuletzt durch den Benutzer das letzte Mal ausgewählt wurde sie die App benutzt hatte. Ich hatte gehofft, dass die letzte Zeile dieser Funktion würde ein Signal ausgelöst, dass die nächste Combo-Box die Funktion ein Element verursachen würde (comboBox2) zu laden und vorzuwählen. Und diese Aktion würde dann dazu führen, die nächste comboBox's Funktion zu aktivieren, und es würde die nächste und die nächste Kaskade. Aber es ist nicht in allen Fällen zu arbeiten.

Ich habe zwei Versionen der Signale versucht:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)

und

self.connect(comboBox1, QtCore.SIGNAL("activated(const QString&)"), self.load_comboBox2)

Im ersten Fall wird das Signal nur ausgelöst, wenn die intLastSavedState1 anders ist als das, was derzeit in der Combo-Box ausgewählt ist. Dies führt zu einem Problem, wenn der Benutzer letztes Element 0 aus dieser Liste ausgewählt hatte. In diesem Fall QT nicht erkennt meinen Skript den den aktuellen Index auf 0 als eine Einstellung ändern (da nach der Box laden sie es bereits auf dem Index 0 zu denken erscheinen), und so wird das Signal nicht Feuer.

Im zweiten Fall wird das Signal unabhängig von Feuer, was gerade im Kombinationsfeld ausgewählt ist ... aber nur, wenn vom Benutzer aktiviert. Es wird nicht Feuer, wenn mein Skript versucht programmatisch den aktuellen Index zu setzen.

Diese erscheinen meine nur zwei Möglichkeiten in Bezug auf die Signale sein. So ... ist es eine andere Möglichkeit der Vorauswahl Elemente in einem QCombobox, die ein Signal jedes Mal ausgelöst werden?

War es hilfreich?

Lösung

Nun ja ... manchmal nur der Akt der eine Frage stellen können Sie zu einem (Teil-) Antwort führen.

Ich habe eine Behelfslösung, aber ich bin interessiert immer noch zu hören, wenn jemand eine bessere Idee hat.

Ich bin jetzt Einstellung programmatisch den Index des QCombobox zu -1 unmittelbar nach dem Laden auf. Dann, als ich den aktuellen Index auf der Benutzer-Geschichte basierte programmatisch gesetzt ist, wird es immer eine Änderung in Betracht gezogen werden (das heißt, es wird nie sein -1) und das Signal wird ausgelöst

mit: currentIndexChanged(const QString&)

Also mein Code sieht wie folgt nun:

comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.setCurrentIndex(-1)
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)

und mein Signal sieht wie folgt aus:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)

Diese Funktion ... hat jemand eine bessere Idee?

Danke agian.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top