Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将函数连接到主线程外的PyQt信号_Python_Multithreading_Pyqt_Pyqt5 - Fatal编程技术网

Python 如何将函数连接到主线程外的PyQt信号

Python 如何将函数连接到主线程外的PyQt信号,python,multithreading,pyqt,pyqt5,Python,Multithreading,Pyqt,Pyqt5,我正在创建一个PyQt应用程序,我希望有一个后台线程连接一些事件处理程序,然后永远循环,直到主窗口关闭。我遇到的问题是,我正在连接的事件处理程序只有在它们是在我的MainWindow类中定义的函数时才起作用。我在下面创建了一个最小复制: import threading from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QVBoxLayout class MainWindow(QDialog): def _

我正在创建一个PyQt应用程序,我希望有一个后台线程连接一些事件处理程序,然后永远循环,直到主窗口关闭。我遇到的问题是,我正在连接的事件处理程序只有在它们是在我的
MainWindow
类中定义的函数时才起作用。我在下面创建了一个最小复制:

import threading
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QVBoxLayout


class MainWindow(QDialog):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.button1 = QPushButton("Click Me", self)
        self.button2 = QPushButton("Me Too!", self)

        layout = QVBoxLayout()
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        self.setLayout(layout)

    def test(self):
        print("test inside class")


def test2():
    print("test outside class")


def main(window):
    window.button1.clicked.connect(window.test)
    window.button2.clicked.connect(test2)
    # Loop that runs in thread...


app = QApplication([])
window = MainWindow()
window.show()
threading.Thread(target=main, args=[window]).start()
app.exec_()

当我运行此代码时,第一个按钮按预期将消息打印到控制台,但第二个按钮在单击时不执行任何操作。如果我在主线程中运行
main(window)
函数,那么两个按钮都可以工作。我知道,在我的小示例程序中,这是显而易见的解决方案,但由于解释起来很复杂的原因,我需要能够从应用程序中的后台线程连接事件处理程序。当我在主线程之外执行时,为什么连接在
main窗口
类之外定义的
test2()
之类的函数不起作用?

我仍在寻找问题的原因,但解决方法是指出连接的类型,在本例中,
Qt::DirectConnection
将使函数test2在发出信号的对象的同一线程上运行(发出信号的对象是主线程中的按钮)


谢谢,使用Qt.DirectConnection解决了这个问题。
import threading
from PyQt5 import QtCore, QtWidgets

class MainWindow(QtWidgets.QDialog):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.button1 = QtWidgets.QPushButton("Click Me")
        self.button2 = QtWidgets.QPushButton("Me Too!")
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)

    @QtCore.pyqtSlot()
    def test(self):
        print("test inside class")

def test2():
    print("test outside class")

def main(window):
    window.button1.clicked.connect(window.test)
    window.button2.clicked.connect(test2, QtCore.Qt.DirectConnection)
    while True:
        QtCore.QThread.sleep(1)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    threading.Thread(target=main, args=(window,), daemon=True).start()
    sys.exit(app.exec_())