【问题标题】:SIGNAL emit works only in one function, but not in others?SIGNAL emit 仅适用于一种功能,但不适用于其他功能?
【发布时间】: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


【解决方案1】:

我的帖子是对的。 Thread() 和 Thread(create=False) 之间的区别至关重要。我必须定义一个新方法(一个是self.thread = Thread(),另一个是self.diff_thread = Thread(create=False))并连接到不同的插槽以使其工作。

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 2015-11-27
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多