Frage

Ich übe PyQt und (Q) Fäden durch ein einfaches Twitter-Client zu machen. Ich habe zwei Qthreads.

  1. Main / GUI-Thread.

  2. Twitter holen Thread -. Fetches Daten von Twitter alle X Minuten

alle X Minuten mein Twitter-Thread So lädt eine neue Reihe von Status-Updates (eine Python-Liste). Ich mag diese Liste zu übergeben an den Main / GUI-Thread, so dass sie das Fenster mit diesem Status aktualisieren.

Ich gehe davon aus, dass ich das Signal / Slot-System wurde mit dem „Status“ Python-Liste aus dem Twitter Thread zu übertragen, auf den Main / GUI-Thread. Also, meine Frage ist zweifach:

  1. Wie kann ich den Status von dem Twitter-Thread senden?

  2. Wie kann ich sie in der Main / GUI-Thread erhalten?

Soweit ich das beurteilen kann, PyQt können standardmäßig nur PyQt-Objekte über die Signale / Slots senden. Ich denke, ich soll irgendwie ein eigenes Signal zu registrieren, die ich dann senden kann, aber die Dokumentation zu diesem Thema, dass ich gefunden habe, ist auf einen Neuling wie ich sehr unklar. Ich habe ein PyQt Buch auf Bestellung, aber es wird in einer Woche nicht ankommen, und ich will nicht bis dahin warten. : -)

Ich bin mit PyQt 4.6-1 auf Ubuntu

Update:

Dies ist ein excert aus dem Code, der nicht funktioniert. Erstens, ich versuche, "connect" das Signal ( "newStatuses", einen Namen, den ich aus nur) auf die Funktion self.update_tweet_list im Haupt / GUI-Thread:

QtCore.QObject.connect(self.twit_in,
                       QtCore.SIGNAL("newStatuses (statuses)"),
                       self.update_tweet_list)

Dann wird in dem Twitter-Thread, ich dies tun:

self.emit(SIGNAL("newStatuses (statuses)"), statuses)

Wenn diese Zeile genannt wird, ich die folgende Meldung:

QObject::connect: Cannot queue arguments of type 'statuses'
(Make sure 'statuses' is registered using qRegisterMetaType().)

Ich habe eine Suche nach qRegisterMetaType (), aber ich habe nichts zu Python im Zusammenhang feststellen, dass ich verstehen konnte.

War es hilfreich?

Lösung

Aus diesem Beispiel:

http://doc.qt.digia.com/4.5/qmetatype.html

 int id = QMetaType.type("MyClass");

Sie können in Python aufschreiben

from PyQt4 import QtCore    
id = QtCore.QMetaType.type('MyClass')

Bearbeiten

Die Antwort aus dem Kommentar extrahiert:

self.emit(SIGNAL("newStatuses(PyQt_PyObject)"), statuses)

Andere Tipps

Sie können dies auch tun, was viel mehr pythonic ist (und lesbar!).

# create a signal equivalent to "void someSignal(int, QWidget)"
someSignal = QtCore.pyqtSignal(int, QtGui.QWidget)

# define a slot with the same signature
@QtCore.pyqtSlot(int, QtGui.QWidget)
def someSlot(status, source):
    pass

# connect the signal to the slot
self.someSignal.connect(self.someSlot)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top