通过PyQt信号/插槽连接时,对象复制的频率是多少?

时间:2015-06-06 01:25:28

标签: python pyqt signals-slots pyqt5

This interesting article评估在Qt中通过信号/插槽连接传递时对象复制的频率。基本上,结果是当在C ++中通过const引用传递时,对象根本不被复制(用于直接连接)或被复制一次(用于排队连接)。

PyQt怎么样?同样举行吗?对于Python对象,在制作副本时,它是一个深层副本吗?

我主要对PyQt5和Python 3感兴趣。

1 个答案:

答案 0 :(得分:4)

正如@ekhumoro所建议的那样,我确实尝试过,令人惊讶的是,我得到的结果与C ++中的测试结果不同。基本上,我的测试显示:对象根本不会被复制,即使使用QueuedConnection跨线程边界传递

考虑以下测试代码:

Emitting data [1] in thread <PyQt5.QtCore.QThread object at 0x7f037619f948>
Received data [1] in thread <PyQt5.QtCore.QThread object at 0x7f037619faf8>
Current data is [1]
Modified data to [1, 1]
Current data is [1, 1]
Modified data to [1, 1, 1]
Current data is [1, 1, 1]
Modified data to [1, 1, 1, 1]
Current data is [1, 1, 1, 1]
...

结果是:

data

表明尽管发送插槽和接收插槽位于不同线程,但它们共享通过QueuedConnection发送的"SELECT * FROM article WHERE type = \'lnews\' AND article_id = 1776425144629" 对象。