【问题标题】:Can,t resize QWidget from QThread in pyqt5Can,t 在 pyqt5 中从 QThread 调整 QWidget 的大小
【发布时间】:2021-02-13 23:47:17
【问题描述】:

我想从另一个用 QThread 制作的线程调整我的 QWidget 的大小,但是当我这样做时,我的应用程序卡在加载中(崩溃)

这是我的代码:

from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication, QWidget
from sys import exit

Application = QApplication([])
Window = QWidget()
thread = QThread()
thread.run = lambda: Window.resize(400, 100)
Window.show()
thread.start()
exit(Application.exec_())

【问题讨论】:

    标签: python user-interface pyqt


    【解决方案1】:

    不允许从 主 Qt 线程以外的线程访问 QWidgets。
    请注意,访问意味着:创建新的小部件、读取/写入小部件属性或调用任何小部件功能。

    唯一且正确的方法是使用信号。这允许 Qt 将信号排队(以防它检测到发送者或接收者在不同的线程上)并在其事件队列被正确处理后立即依赖接收者。

    为此,通常最好对 QThread 进行子类化(理论上可以不进行子类化,但没有实际好处,它可能只会让事情变得比要求的更复杂)。

    from PyQt5.QtCore import QThread, pyqtSignal
    from PyQt5.QtWidgets import QApplication, QWidget
    from sys import exit
    from time import sleep
    
    class Mover(QThread):
        move = pyqtSignal(int, int)
        def run(self):
            sleep(5)
            self.move.emit(400, 100)
    
    Application = QApplication([])
    Window = QWidget()
    thread = Mover()
    thread.move.connect(Window.move)
    Window.show()
    thread.start()
    exit(Application.exec_())
    

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 2011-11-23
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多