我在练习PyQt和(Q)的线程通过做一个简单的Twitter的客户。我有两个Qthreads.

  1. 主/GUI线。

  2. Twitter取线获取数据,从Twitter每一个X分钟。

所以,每一个X分钟我Twitter线下载一个新的状态更新(Python列表)。我要把这个列表的主要/GUI线程,以便使它可以更新的窗口与这些状态。

我假设我应该使用的信号/槽系统,以转移的"状态"蟒列从Twitter线,主/GUI线。因此,我的问题是双重的:

  1. 我怎么送的状态,从Twitter线?

  2. 我怎么会收到他们在主/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)")

我通过弦在我的例子,但你应该能够替代 strlist.

如果事实证明,你可以不通过可变的目的,你可以处理结果的方式我做我的实例(即设置一个 results 变量的在线告诉主线,他们已经准备好,并且拥有的主线"挑选他们")。

更新:

你得到的消息 QObject::connect: Cannot queue arguments of type 'statuses' 因为你需要定义 类型 的论点,即你将通过当你这些的,你的信号。是那种你想要通过的是 liststatuses.

当你连你的信号应该是这样的:

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.

我建议你尝试在一个小型玩具的例子第一,在移动应用程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top