我有问题。我的PyQt5应用程序在我调整大小,拖动,最大化窗口时崩溃。这是线程:
class ImageCapturer(QtCore.QThread):
changeImages = QtCore.pyqtSignal(QtGui.QImage, QtGui.QImage)
lower_hsv = numpy.array([0,0,0])
upper_hsv = numpy.array([180,255,255])
cap = cv2.VideoCapture(1)
def run(self):
while True:
ret, frame = self.cap.read()
if ret:
original = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#Some modification to frame
height, width, channel = original.shape
qt_img = QtGui.QImage(original, width, height, original.strides[0], QtGui.QImage.Format_RGB888)
height, width, channel = frame.shape
qt_img2 = QtGui.QImage(frame, width, height, res.strides[0], QtGui.QImage.Format_RGB888)
self.changeImages.emit(qt_img, qt_img2)
self.cap.release()
这也是与信号连接的功能:
@pyqtSlot(QtGui.QImage,QtGui.QImage)
def setImages(self, original, frame):
qt_pixmap = QtGui.QPixmap.fromImage(original)
self.original_image.setPixmap(qt_pixmap)
qt_pixmap = QtGui.QPixmap.fromImage(res)
self.processed_image.setPixmap(qt_pixmap)
这里的标签代码:
self.original_image = QtWidgets.QLabel()
self.original_image.setStyleSheet('border : 1px solid gray')
self.original_image.setMinimumHeight(240)
self.original_image.setMinimumWidth(320)
self.original_image.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
self.original_image.setScaledContents(True)
self.processed_image = QtWidgets.QLabel()
self.processed_image.setStyleSheet('border : 1px solid gray')
self.processed_image.setMinimumHeight(240)
self.processed_image.setMinimumWidth(320)
self.processed_image.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
self.processed_image.setScaledContents(True)
这里是我如何创建该线程的实例:
self.getImagesThread = ImageCapturer(self)
self.getImagesThread.changeImages.connect(self.setImages)
self.getImagesThread.setTerminationEnabled(True)
我也是基于PyQt showing video stream from opencv
创建的它不会一直发生,但最多会发生。有时我可以调整最大化大小以及所有这些。.而且我也没有收到任何异常消息或任何其他消息..因为一旦发生,我便从IDLE运行它,它只显示“ >>>”,基本上就是这样。有没有人有办法解决吗?我是这种事物的新手...当我使用self.msleep(500)
说时,它也可以正常工作..但是,当我希望它平滑且我希望将其作为视频时,这有什么意义呢?>
答案 0 :(得分:0)
如果没有特别注意,则无法使用线程和GUI。除了主线程外,您不能从任何其他操作GUI对象。如果要将工作卸载到后台线程,请小心通过排队的信号插槽连接将结果传递到主线程。有关此信息,请参阅Qt文档-线程文档中有一些食谱。或看看这个问题:Background thread with QThread in PyQt