Frage

wx (und wxPython) zwei Ereignisse, die ich in PyQt verpassen:

  • EVT_IDLE, die an einem Rahmen gesendet wird wird. Es können die verschiedenen Widgets verwendet werden, zu aktualisieren, entsprechend dem Antrag der Zustand
  • EVT_UPDATE_UI, die zu einem Widget gesendet wird ist, wenn wurde neu gestrichen und aktualisiert werden, so kann ich seinen Zustand in dem Handler
  • berechnen

Nun ist PyQt nicht scheinen, diese zu haben, und das PyQt Buch schlägt eine updateUi Methode zu schreiben und es manuell aufrufen. Ich landete sogar bis es von einem Timer einmal pro 0,1 Sekunden aufrufen, um viele manuelle Anrufe von Methoden zu vermeiden, dass die GUI aktualisieren. Bin ich etwas fehlt? Gibt es einen besseren Weg, dies zu erreichen?


Ein Beispiel: Ich habe eine einfache Anwendung mit einer Start-Schaltfläche, die einige Verarbeitung initiiert. Die Start-Taste sollte nur aktiviert werden, wenn eine Datei das Menü geöffnet wurde verwendet. Darüber hinaus gibt es ein permanentes Widget in der Statusleiste, die Informationen angezeigt werden.

Meine Anwendung hat heißt es:

  1. Bevor die Datei (in diesem Zustand auf die Statusleiste zeigt etwas Besonderes und die Start-Taste ist deaktiviert)
  2. geöffnet
  3. Die Datei wurde geöffnet und die Verarbeitung wurde nicht gestartet: die Start-Taste aktiviert ist, Statusleiste zeigt etwas anderes
  4. Die Verarbeitung läuft: die Start-Taste sagt jetzt „Stop“ und die Statusleiste Fortschrittsberichte

In Wx, würde ich das Update UI-Ereignis der Schaltfläche haben seinen Zustand Griff: den Text auf, und ob es aktiviert ist, je nach Anwendungszustand. Gleiches gilt für die Statusleiste (oder ich EVT_IDLE dafür verwenden würde).

In Qt, ich habe die Schaltfläche in mehreren Methoden zu aktualisieren, die den Zustand beeinflussen können, oder einfach nur einen update_ui Methode erstellen und sie in regelmäßigen Abständen in einem Timer aufrufen. Was ist das mehr "QT" -ish Weg?

War es hilfreich?

Lösung

Die Verwendung von EVT_UPDATE_UI in wxWidgets scheint einer der grundlegenden Unterschiede in der Art und Weise Entwickler wxWidgets und Qt zu markieren erwarten Ereignisse in ihrem Code zu behandeln.

Mit Qt, verbinden Sie Signale und Slots zwischen Widgets in der Benutzeroberfläche, entweder Umgang mit „Business-Logik“ in jedem Schlitz oder in eine spezielle Methode delegieren. Sie sorgen sie normalerweise nicht darum, getrennte Änderungen jedes Widget in Ihrer GUI, weil alle Anfragen in der Ereigniswarteschlange gestellt werden neu aufgebaut, und wenn die Steuerung kehrt zu der Ereignisschleife geliefert. Einige Lack Ereignisse selbst zusammengefügt werden können zusammen aus Gründen der Effizienz.

Also, in einer normalen Qt-Anwendung, wo Signale und Slots verwendet werden Zustandsänderungen zu handhaben, gibt es im Grunde keine Notwendigkeit, einen Leerlaufmechanismus zu haben, die den Zustand der Anwendung und Update-Widgets überwacht, da dieser Updates automatisch erfolgen soll.

Sie wäre ein bisschen mehr darüber sagen, was Sie zu erklären, warum tun Sie ein Äquivalent zu diesem Ereignis in Qt benötigen.

Andere Tipps

würde ich Qt-Signale senden, um Zustandsänderungen (z FileOpened, processingStarted, processingDone) anzuzeigen. Slots in Objekten Verwaltung die Starttaste und Statusleiste Widget (oder Unterklassen) kann auf diese Signale angeschlossen werden, sondern als „Polling“ für aktuellen Zustand in einem Ruhe Ereignisse.

Wenn Sie das Signal später statt sofort in der Ereignisschleife verschoben werden (zB weil es ein wenig Zeit dauern wird, etwas zu tun), können Sie eine „Warteschlange“ Signal-Slot-Verbindung anstatt der normale Art.

http://doc.trolltech.com/4.5/signalsandslots.html#signals

Die Verbindungsart ist ein optionaler Parameter an die Funktion connect (): http://doc.trolltech.com/4.5/qobject.html#connect http://doc.trolltech.com/4.5/qt.html# Connection-Enumeration

Soweit ich verstehe EVT_IDLE gesendet wird, wenn Anwendungsnachrichtenwarteschlange leer ist. Es gibt kein solches Ereignis in Qt, aber wenn Sie etwas in Qt ausführen müssen, wenn es keine ausstehenden Ereignisse, sollten Sie mit 0 Timeout verwenden QTimer.

In der Regel, desto mehr Qt-ish Art und Weise ist es, die Taste / Symbolleiste nach Bedarf in aktualisieren, was auch immer Funktionen benötigen Sie das Update oder einen Teil der Funktionalität zu konsolidieren und diese Funktion direkt aufrufen, wenn das Programm braucht es (wie ein updateUI Funktion).

Sie sollten sich bewusst sein, dass in Qt, ist ein Attribut eines Ui-Element ändert sich nicht sofort redraw verursachen, aber ein erneutes Zeichnen im Ereignissystem Warteschlangen, und mehrere Anrufe werden in eine neu zu zeichnen komprimiert, wo möglich.

Wie bei dem mehreren Änderungen an Status liefert, hat einen Blick auf dieses Blog-Post über eine hoffentlich-kommenden Neben Qt, um noch einfacher Staaten zu behandeln. Es sieht aus wie diese Pflege einer Menge Ihre Beschwerden nehmen würde, weil in Ihrem mehrere Funktionen, können Sie nur die Zustandsgröße Übergang, und die anderen Teile der Benutzeroberfläche sollten übereinstimmen aktualisieren. Es ist nicht positiv diese es in die nächste Qt-Release machen (obwohl ich es auf, oder etwas ähnliches setzen würde), und ich habe keine Ahnung, wie eng PyQt verfolgt die Qt freigibt. Oder alternativ können Sie das Konzept nutzen und Ihre eigene Klasse erstellen, den Staat zu verfolgen je nach Bedarf.

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