【发布时间】:2011-12-16 08:43:27
【问题描述】:
我有一个有点奇怪的问题。我正在编写一个多线程应用程序并使用 SIGNALS 将 QThread 的数据传递给 GUI 类数据。废话不多说,下面是简化的代码。
class GUI(uiMainWindow.MainWindow):
def __init__(self, parent=None):
super etc
self.thread = Thread()
self.connect(self.thread, SIGNAL("changeStatus(QString)"), self.setStatus, Qt.QueuedConnection)
def setStatus(self, status):
self.statusBar.setText(status)
class Thread(QThread):
def __init__(self, parent=None, create=True):
super etc
self.create = create
def run(self):
if self.create:
create_data()
if not self.create:
upload_data()
def create_data(self):
self.emit(SIGNAL("changeStatus(QString)"), "Changing the statusbar text")
#rest of the code
def upload_data(self):
self.emit(SIGNAL("changeStatus(QString)"), "Changing the statusbar text")
很基本,对吧?但是,问题出在:self.emit 仅在 create_data 函数中有效,而在 upload_data 中无效(或者就此而言,在任何其他函数中;我也尝试将其放入 __init__ 中)。我尝试将print "I got the status" + status 放入 setStatus 函数中。同样,它在 create_data() 函数中有效,但在 upload_data() 函数中无效。
这两个函数之间的差异相对较小,据我所知,没有什么会干扰 self.emit 函数 - 事实上,在这两种情况下,self.emit 都只有 4-5 行“距离”来自函数定义。
这真的让我很困惑。有什么帮助吗?提前致谢!
编辑:再次,据我所知,这两个函数之间的唯一区别在于 run() - 如果创建参数为 True,则调用第一个函数,如果为 False,则调用第二个函数。
【问题讨论】:
-
除了信号签名中多余的
(QString)之外,您发布的示例代码没有任何问题。请发布一个完整的、可运行的示例来演示该问题。 -
@ekhumoro:我希望我能做到这一点,但程序是封闭源代码 :( 那么你是说 QString 完全没有必要吗?我应该把它留空吗(即
changeStatus())? -
如果您使用旧式语法,并将 python 信号连接到 python 可调用对象,则只需要名称(例如
changeState)。有关各种可能性,请参阅here。当然,对于新项目,最好使用new-style syntax。 -
我一直想切换到新式信号,但我赶上了最后期限。也许在应用程序的 v2 中。不过感谢您的提示,我很感激。
标签: python qt pyqt signals-slots