PyQt5 QThread进程以退出代码139结束(被信号11:SIGSEGV中断)



我有一个带有PyQt5的GUI。GUI有一个Form、2个按钮和一个ProgressBar。我想用QThread实现一个启动/等待线程。不幸的是,当我单击"开始"按钮运行线程时,进程完成了,退出代码为139(被信号11:SIGSEGV中断(。

主窗口.py

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'MainWindow.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 138)
self.btnRun = QtWidgets.QPushButton(Form)
self.btnRun.setGeometry(QtCore.QRect(20, 20, 89, 25))
self.btnRun.setObjectName("btnRun")
self.btnStop = QtWidgets.QPushButton(Form)
self.btnStop.setGeometry(QtCore.QRect(20, 60, 89, 25))
self.btnStop.setObjectName("btnStop")
self.progressBar = QtWidgets.QProgressBar(Form)
self.progressBar.setGeometry(QtCore.QRect(20, 100, 371, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Test Thread"))
self.btnRun.setText(_translate("Form", "Run"))
self.btnStop.setText(_translate("Form", "Stop"))

当我单击"开始"按钮时,应用程序会因分段故障而崩溃。

Thread.py

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from MainWindow import *
import sys
import time
class MainWindow(QWidget, QThread):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.ui = Ui_Form()
self.ui.setupUi(self)
self.center()
#Init progressBar
self.ui.progressBar.setValue(0)
#Buttons
self.ui.btnRun.clicked.connect(self.start)
self.ui.btnStop.clicked.connect(self.wait)
def run(self):
count = 0
while count <= 100:
count += 1
self.ui.progressBar.setValue(count)
time.sleep(1)
def center(self):
# geometry of the main window
qr = self.frameGeometry()
# center point of screen
cp = QDesktopWidget().availableGeometry().center()
# move rectangle's center point to screen's center point
qr.moveCenter(cp)
# top left of rectangle becomes top left of window centering it
self.move(qr.topLeft())

if __name__ == '__main__':
app = QApplication(sys.argv)
app.setAttribute(Qt.AA_DontShowIconsInMenus, False)
w = MainWindow()
#   Disable maximize window button
w.setWindowFlags(Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint)
w.show()
sys.exit(app.exec_())

问题是不能同时从QWidget和QThread继承,因为:

  • 无法从2 QObject继承,行为中存在冲突
  • PyQt限制多重继承

解决方案是使用组合而不是多重继承。

class Thread(QThread):
progressChanged = pyqtSignal(int)
def run(self):
count = 0
while count <= 100:
count += 1
self.progressChanged.emit(count)
time.sleep(1)
class MainWindow(QWidget):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.ui = Ui_Form()
self.ui.setupUi(self)
self.center()
self._custom_thread = Thread()
#Init progressBar
self.ui.progressBar.setValue(0)
#Buttons
self.ui.btnRun.clicked.connect(self._custom_thread.start)
self.ui.btnStop.clicked.connect(self._custom_thread.wait)
self._custom_thread.progressChanged.connect(self.ui.progressBar.setValue)

相关内容

  • 没有找到相关文章