题
我在练习PyQt和(Q)的线程通过做一个简单的Twitter的客户。我有两个Qthreads.
主/GUI线。
Twitter取线获取数据,从Twitter每一个X分钟。
所以,每一个X分钟我Twitter线下载一个新的状态更新(Python列表)。我要把这个列表的主要/GUI线程,以便使它可以更新的窗口与这些状态。
我假设我应该使用的信号/槽系统,以转移的"状态"蟒列从Twitter线,主/GUI线。因此,我的问题是双重的:
我怎么送的状态,从Twitter线?
我怎么会收到他们在主/GUI线?
我可以告诉,PyQt可以由默认只有发PyQt对象通过信号/隙。我认为我应该以某种方式注册的定制信号然后我就可以发送,但文件上的这个我已经找到了是很不清楚一个新手我一样。我有一个PyQt书的顺序,但它不会到达一个星期,我不想等到那时。:-)
我使用的PyQt4.6-1Ubuntu
更新:
这是一个excert的代码不起作用。第一,我尽量"连接"的信("newStatuses",一个名字我只是做了)以功能的自我。update_tweet_list在主/GUI线:
QtCore.QObject.connect(self.twit_in,
QtCore.SIGNAL("newStatuses (statuses)"),
self.update_tweet_list)
然后,在Twitter线,我这样做:
self.emit(SIGNAL("newStatuses (statuses)"), statuses)
当这条线打电话,我得到以下信息:
QObject::connect: Cannot queue arguments of type 'statuses'
(Make sure 'statuses' is registered using qRegisterMetaType().)
我做了一个搜索qRegisterMetaType()但是我没找到任何有关蟒蛇,我可以理解的。
解决方案
从这个例子:
http://doc.qt.digia.com/4.5/qmetatype.html
int id = QMetaType.type("MyClass");
你可以写下在蟒蛇
from PyQt4 import QtCore
id = QtCore.QMetaType.type('MyClass')
编辑
答案取从评论意见:
self.emit(SIGNAL("newStatuses(PyQt_PyObject)"), statuses)
其他提示
你也可以做到这一点,这是更python(和可读!).
# 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)
看看这个 我问的问题 一会儿回来。有一个代码的例子,可能会帮助你出什么你需要做的。
你说什么关于登记您的信号使我想起这个代码(从上述问题):
class ProcessingThread(threading.Thread, QtCore.QObject):
__pyqtSignals__ = ( "progressUpdated(str)",
"resultsReady(str)")
我通过弦在我的例子,但你应该能够替代 str
与 list
.
如果事实证明,你可以不通过可变的目的,你可以处理结果的方式我做我的实例(即设置一个 results
变量的在线告诉主线,他们已经准备好,并且拥有的主线"挑选他们")。
更新:
你得到的消息 QObject::connect: Cannot queue arguments of type 'statuses'
因为你需要定义 类型 的论点,即你将通过当你这些的,你的信号。是那种你想要通过的是 list
不 statuses
.
当你连你的信号应该是这样的:
QtCore.QObject.connect(self.twit_in,
QtCore.SIGNAL("newStatuses(list)"),
self.update_tweet_list)
当你发出的信号应该是这样的:
self.emit(SIGNAL("newStatuses(list)"), statuses)
鉴 statuses
是一个列表。注意你可能会想要这些的一个深刻的副本列表,这取决于你的情况。
更新2:
Ok,使用 list
作为类型是不正确的。从PyQt4帮助参考:
PyQt的信号,并建信号
夸脱的信号是静态定义为 部分C++类。他们 引用的使用
QtCore.SIGNAL()
功能。此 方法需要一个单一的参数字符串 这就是名称的信号及其 C++的签名。例如:QtCore.SIGNAL("finished(int)")
返回的价值通常是通过了 来的
QtCore.QObject.connect()
法。PyQt允许新的信号被定义 动态。该法发射 PyQt信号隐含的定义。PyQt v4信号也是引用 使用
QtCore.SIGNAL()
功能。的
PyQt_PyObject
信号的参数类型它可能通过的任何蟒蛇 目作为一个信号的参数通过 指定
PyQt_PyObject
作为 类型的参数签名。例如:QtCore.SIGNAL("finished(PyQt_PyObject)")
虽然这通常会使用 通过对象名单和 字典作为信号的参数, 可用于任何蟒蛇类型。它的 利用经过时,例如 整是正常的 转换从Python对象 C++整数,然后再返回是不是 需要。
参考数目 正在通过维持 自动的。没有必要 发射信号保持一 参照对象的电话后 要
QtCore.QObject.emit()
, 即使 一个连接是排队。
当你使用这些旧式的信号/槽PyQt,实际上没有需要声明的类型。这些应工作:
QtCore.QObject.connect(self.twit_in,
QtCore.SIGNAL("newStatuses"),
self.update_tweet_list)
...
self.emit(SIGNAL("newStatuses"), statuses)
在这种情况下,PyQt将只是创建一个新的类型的信号对于您在飞行当你发出的信号。如果你想到用户的新式信号,那么它看起来更像是:
class TwitterThread(QThread):
newStatuses = pyqtSignal(object)
....
self.newStatuses.emit(statuses)
(Py)夸脱的信号,并插槽工作的交叉线一样的,因为在一个单一的线。所以没有什么很特别的设置:
定义一个老虎(方法)在主要线程,以及连接线的信号到这个老虎(连接还将完成在主要螺纹)。然后,在线程,当你想到,只要这些信号及它应工作。 这里有一个教程 在使用的信号,并插槽穿在PyQt.
我建议你尝试在一个小型玩具的例子第一,在移动应用程序。