QThread 在线程仍然存在时被销毁 运行

QThread Destroyed while thread is still running

我正在尝试 运行 QThread 中的 ZeroMQ。我所做的是当消息到达时我发出 msg_received 信号。在 App class 中,show_my_window 方法连接到它,因此它会显示一个简单的对话框。

问题是当我关闭那个对话框时,我得到以下信息

QThread: Destroyed while thread is still running

Process finished with exit code -1073740791 (0xC0000409)

这是我的代码:

class ZMQThread(QThread):
    msg_received = Signal()

    def __init__(self):
        super(ZMQThread, self).__init__()
        self.context = zmq.Context()
        self.socket = self.context.socket(zmq.REP)
        self.socket.bind("tcp://*:3344")

    def run(self):
        while True:
            message = self.socket.recv()
            self.msg_received.emit()
            
class MyWindow(QtWidgets.QDialog):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.ui = Ui_MyDialog()
        self.ui.setupUi(self)
        self.ui.ButtonOK.clicked.connect(self.ok)

    def ok(self):
        self.accept()
  
class App:
    def __init__(self):
        self.qtapp = QtWidgets.QApplication([])
        self.my_window = MyWindow()
        self.zmq_thread = ZMQThread()
        self.zmq_thread.msg_received.connect(self.show_my_window)
        self.zmq_thread.start()

    def show_my_window(self):
        self.my_window.show()


if __name__ == '__main__':
    my_gui = App()
    sys.exit(my_gui.qtapp.exec())

我这里没有主 window,想知道这是否有问题?我不想要一个主要的 window,这个应用程序将 运行 在托盘上,但首先我想实现这部分。我已经检查了一些非常相似的问题,但是在检查了这些解决方案之后,它们并没有奏效。 这可能是什么问题?

默认情况下,Qt在最后一次打开window关闭时结束eventloop,而当eventloop结束时,QThread并没有正确关闭。解决方案是使用 quitOnLastWindowClosed 属性:

禁用此功能
self.qtapp = QtWidgets.QApplication([])
self.qtapp.setQuitOnLastWindowClosed(False)