PyQt6--Python桌面开发(28.垂直布局Vertical Layout--QVBoxLayout)

PyQt6布局管理

在这里插入图片描述

垂直布局

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

### PyQt与OpenCV-Python多线程图像显示实现方法 为了在PyQt中使用OpenCV-Python进行多线程图像显示,通常会采用`QThread`来管理摄像头数据采集的任务。这样可以避免主线程被阻塞,从而保持GUI界面的响应性。以下是具体的技术细节: #### 使用QThread分离任务 在PyQt中,直接在主线程中执行耗时操作(如读取摄像头帧)可能会导致UI卡顿甚至无响应。因此,推荐将摄像头捕获逻辑放入子线程中运行。可以通过继承`QThread`类创建一个新的线程对象,并在其内部完成摄像头帧的抓取工作[^1]。 #### 数据传递机制 当子线程成功获取到一帧图像后,需将其发送回主窗口以便更新界面上指定控件的内容。这一步可通过信号槽机制完成:定义一个自定义信号用于携带每张图片的数据;每当新画面准备好就触发该信号并将对应numpy数组作为参数传出去;最后连接此信号至某个插槽函数负责实际渲染过程[^3]。 #### 示例代码展示 下面给出一段完整的示范代码片段说明上述流程是如何工作的: ```python import sys from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget import cv2 class VideoThread(QThread): change_pixmap_signal = pyqtSignal(QImage) def run(self): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if ret: rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgb_image.shape bytes_per_line = ch * w convert_to_qt_format = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) p = convert_to_qt_format.scaled(640, 480, Qt.KeepAspectRatio) self.change_pixmap_signal.emit(p) class App(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Qt live label demo") self.disply_width = 640 self.display_height = 480 # create the label that holds the image self.image_label = QLabel(self) self.image_label.resize(self.disply_width, self.display_height) # create a vertical box layout and add the two labels vbox = QVBoxLayout() vbox.addWidget(self.image_label) # set the vbox layout as the widgets layout self.setLayout(vbox) # create the video capture thread self.thread = VideoThread() # connect its signal to the update_image slot self.thread.change_pixmap_signal.connect(self.update_image) # start the thread self.thread.start() @pyqtSlot(QImage) def update_image(self, image): self.image_label.setPixmap(QPixmap.fromImage(image)) if __name__ == "__main__": app = QApplication(sys.argv) win = App() win.show() sys.exit(app.exec_()) ``` 这段脚本展示了如何利用Python结合PyQt框架以及OpenCV库构建简单的实时视频流应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce-li__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值