pyqt5 卡死解决办法
时间: 2023-12-18 08:27:34 浏览: 115
在PyQt5开发GUI界面时,当后台逻辑执行时间长时,界面容易出现卡死、未响应等问题。这是因为PyQt5是单线程的,当主线程在执行耗时操作时,会阻塞GUI界面的更新,导致界面无法响应用户的操作。为了解决这个问题,可以使用多线程来执行耗时操作,使得主线程可以继续更新GUI界面。
以下是使用QThread来解决PyQt5卡死问题的示例代码:
```python
from PyQt5.QtCore import QThread, pyqtSignal
class Worker(QThread):
finished = pyqtSignal()
progress = pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
def run(self):
# 执行耗时操作
for i in range(100):
self.progress.emit(i)
self.msleep(100)
self.finished.emit()
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.worker = Worker()
self.worker.finished.connect(self.on_finished)
self.worker.progress.connect(self.on_progress)
self.worker.start()
def on_finished(self):
print('耗时操作执行完成')
def on_progress(self, i):
print('耗时操作进度:', i)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在这个示例代码中,我们创建了一个Worker类,继承自QThread类,用于执行耗时操作。在Worker类中,我们定义了一个finished信号和一个progress信号,分别用于表示耗时操作执行完成和耗时操作的进度。在run方法中,我们执行了一个模拟的耗时操作,每隔100毫秒发射一次progress信号,表示进度。在MainWindow类中,我们创建了一个Worker对象,并连接了它的finished信号和progress信号到对应的槽函数中。在MainWindow的构造函数中,我们启动了Worker线程,开始执行耗时操作。
阅读全文