【问题标题】:pyqt signal not emitted when button is clicked after move to QThread移动到 QThread 后单击按钮时未发出 pyqt 信号
【发布时间】:2022-10-04 19:21:27
【问题描述】:

本质上,我有一个程序,它将在单击按钮时开始。一旦我启动该过程,一切正常,直到需要用户输入。但是,当用户单击按钮时,不会发出“单击”信号。信号适当地连接到插槽。将代码移至 QThread 后,按钮单击停止工作。

class Procedure(QObject):
    
    def __init__(self, parent):
        super().__init__()
        self.parent = parent

        self.parent.button_a.clicked.connect(self.on_button_a_clicked)
        self.event = threading.Event()

    def run(self):
        # started running, doing some stuff here

        # waits for button click, i.e. when button is clicked, the event is set and then you may proceed
        self.event.wait()
        # NEVER REACHES HERE

    def on_button_a_clicked(self):
        self.event.set()

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.setFixedSize(self.size())

        self.start_button.clicked.connect(self.on_start_clicked)

    def on_start_clicked(self):
        self.thread = QThread()
        self.worker = Procedure(self)
        self.worker.moveToThread(self.thread)

        self.thread.started.connect(self.worker.run)
        self.thread.start()

def main():

    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()

但是,我确实有迹象表明,信号已正确连接到插槽,就像在功能中一样跑()我手动发出信号,成功模拟了按钮单击。因此,我认为问题在于按钮单击未正确注册。

    def run(self):
        # started running, doing some stuff here

        # following line successfully emulates the button click
        self.parent.button_a.clicked.emit()
        self.event.wait()
        # reaches here successfully

我还认为这与 QThread 有关,因为问题出现在我开始在 QThread 中运行我的程序之后,但我在这里迷失了方向,我不知道如何调试这个问题。 先感谢您。

【问题讨论】:

  • on_button_a_clicked 将被调用它自己的线程,但由于该线程被event.wait() 阻塞,它不能被调用。尝试更改为self.parent.button_a.clicked.connect(self.event.set)。但请注意,访问不相关的父级的子级属性并不是一个好习惯。
  • 你的例子不起作用,因为我在这里给出的代码是最小化的例子,实际上,除了这个函数之外,还有更多的事情发生self.event.set(),但至少现在我知道了问题所在,所以我也许能够弄清楚一些事情。

标签: python pyqt signals-slots qthread


【解决方案1】:

除了threading.Event,您可以在Procedure 中创建插槽并将其直接连接到button_a.clicked,而您根本不需要run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2017-01-23
    • 2020-11-17
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多