在线程中的Qdialog上调用exec()不能正常工作

问题描述 投票:0回答:1

我想在线程中调用my_dialog.exec(),但是当mainwindow(平均主线程)处理事件时,它工作不正常,我想知道如何处理此问题

这是我的测试程序:

import sys
from PyQt5.Qt import *
from threading import Thread
from time import sleep

class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(500, 500, 500, 200)

        self.dialog = QDialog(self)
        self.dialog.setGeometry(500, 500, 200, 100)

        btn = QPushButton('click', self)
        btn.clicked.connect(self.show_dialog)

        self.show()

    def show_dialog(self):
        Thread(target=self.execute).start()

    def execute(self):
        sleep(2)
        # keep moving mainwindow untill dialog have shown
        self.dialog.exec_()

app = QApplication(sys.argv)
e = Main()
sys.exit(app.exec_())

当我按下按钮时,它将首先睡眠两秒钟。没有主窗口的事件是正常的。但是当我在两个睡眠秒中继续移动主窗口(或其他事件,例如调整大小)时,它们两者都将变得无响应

pyqt5 python-3.7
1个回答
0
投票

我在Qt中拥有一条黄金法则:您不能也不应修改其他线程的GUI。有关更多信息,请阅读:GUI Thread and Worker Thread

考虑到上述,在Qt中位于不同线程中的元素之间进行交互的自然方法是使用信号,因为它们是thread-safe,如下所示:

class Main(QMainWindow):
    customSignal = pyqtSignal()

    def __init__(self):
        # ...

        self.show()
        self.customSignal.connect(self.dialog.exec_)

    def show_dialog(self):
        Thread(target=self.execute).start()

    def execute(self):
        sleep(2)
        # keep moving mainwindow untill dialog have shown
        self.customSignal.emit()
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.