我是新来的,几天来一直在努力解决这个问题。我有一个包含三个类(A、B、C)的pyqt5图形用户界面。类A(MainFrame)和B(CameraParameters)是GUI窗口,C(Video_Thread)是线程。您可以从A窗口激活Thread (C)。此外,窗口B可以打开窗口A和有滑块。
线程发出信号(cv2图像)并转换为窗口A上的标签。
窗口B幻灯片假设控制相机属性(cv2.视频捕获(cv2.CAP_PROP))。
我从Thread(C)发送一个信号到窗口(B),并创建一个应该设置Slider值的插槽,但是什么都没有发生。
class MainFrame(QMainWindow):
def __init__(self):
super(MainFrame, self).__init__()
self.Video_Feed_is_Running = False
# Loading UI
uic.loadUi("MainFrame.ui", self)
# Remove maximize button to prevent crushing
self.setWindowFlags(Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint)
# Define Widgets
self.Video_Feed = self.findChild(QLabel, 'Video_Feed')
self.Case_Name = self.findChild(QLineEdit, "Case_Name")
self.Pictures_List = self.findChild(QListWidget, "Pictures_List")
self.Start_Video = self.findChild(QAction, 'actionStart_Video')
self.Start_Video.setShortcut('Shift+S')
self.Stop_Video = self.findChild(QAction, 'actionStop_Video')
self.Stop_Video.setShortcut('Shift+F')
self.Take_a_Picture = self.findChild(QAction, 'actionTake_a_picture')
self.Take_a_Timed_Picture = self.findChild(QAction, 'actionTake_a_timed_picture')
self.Camera_Properties = self.findChild(QAction, 'actionProperties')
# Initializing Video
self.Start_Video.triggered.connect(self.Start_Video_Clicked)
self.Stop_Video.triggered.connect(self.Stop_Video_Clicked)
self.Camera_Properties.triggered.connect(self.Camera_Properties_Clicked)
def Video_Feed_Update(self, Image):
self.Video_Feed.setPixmap(QPixmap.fromImage(Image))
def Start_Video_Clicked(self):
self.Video_Thread = Video_Thread()
self.Video_Thread.start()
self.Video_Thread.ImageUpdate.connect(self.Video_Feed_Update)
self.Video_Feed_is_Running = True
def Stop_Video_Clicked(self):
self.Video_Thread.stop_video()
self.Video_Feed.setText("Your video starts here")
self.Video_Feed_is_Running = False
def Camera_Properties_Clicked(self):
if self.Video_Feed_is_Running:
self.CP = CameraParameters()
self.CP.show()
else:
print("No video feed")
class Video_Thread(QThread):
# Recieving signal
ImageUpdate = pyqtSignal(QImage)
Exposure = pyqtSignal(int)
def __init__(self):
super(Video_Thread, self).__init__()
self.ThreadActive = True
self.Capture = cv2.VideoCapture(1, cv2.CAP_DSHOW)
self.Capture.set(cv2.CAP_PROP_EXPOSURE,-10)
self.Capture.set(3, 1920)
self.Capture.set(4, 1080)
self.Exposure.emit(int(self.Capture.get(cv2.CAP_PROP_EXPOSURE)))
def run(self):
while self.ThreadActive:
ret, frame = self.Capture.read()
if ret:
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Converting Video into QT5 readable format
qt_video_format = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)
qt_picture = qt_video_format.scaled(1280, 720, Qt.KeepAspectRatio)
self.ImageUpdate.emit(qt_picture)
def stop_video(self):
self.ThreadActive = False
self.Capture.release()
class CameraParameters(QDialog):
def __init__(self):
super().__init__()
uic.loadUi('Cam_Parameters.ui', self)
# Define Widgets
self.Video_Thread=Video_Thread()
# Sliders
self.Exposure_Slider = self.findChild(QSlider, 'ExposureSlider')
self.Exposure_Slider.setRange(-10, 10)
# Sliders values
self.Exposure_Value = self.findChild(QLabel, 'Exposure_Value')
self.Video_Thread.Exposure.connect(self.Exposure_set)
def Exposure_set(self, value):
self.Exposure_Slider.setValue(value)
self.Exposure_Value.setText(str(value))
if __name__ == "__main__":
App = QApplication(sys.argv)
Root = MainFrame()
Root.show()
sys.exit(App.exec())谢谢。
发布于 2022-02-21 09:24:17
我无法运行您的代码,因为您没有ui文件,但是现在看来您似乎正试图直接运行一个QThread对象。相反,您应该做的是创建一个worker QObject并分离QThread,然后使用moveToThread()在线程上运行该工作人员。因此,您的Video_Thread()类将是一个QObject,并且您不需要对QThread进行子类处理。下面是我要演示的代码片段:
def apply_calculation(self, selected_calc, selected_holes):
# Step 1: Create a QThread object
self.thread = QThread()
# Step 2: Create a worker object
self.worker = ApplyCalculation(selected_holes, selected_calc)
# Step 3: Move worker to the thread
self.worker.moveToThread(self.thread)
# Step 4: Connect signals and slots
self.thread.started.connect(self.worker.apply_calculation_handler)
self.worker.finished.connect(self.thread.quit)
self.worker.finished.connect(self.worker.deleteLater)
self.thread.finished.connect(self.thread.deleteLater)
self.worker.progress.connect(self.report_progress)
# Step 5: Start the thread
self.thread.start()在这里,您可以看到我与进度报告的连接,它更新了gui中的进度条。
https://stackoverflow.com/questions/71202479
复制相似问题