pyside2界面内加载pythonocc的三维空间显示

这个部分在gitee上有较为纯python的实现: 纯python实现(不带有QT的.ui文件)

其中  实现的关键部分qtDisplay包 也有人写过,这里我们直接使用了;

这里介绍最为精简的一种方式 结合 qt的.ui文件以及pyocc的代码;

我假设你应该使用conda将pythonocc和 pyside2/pyqt5 环境都配置好了;

随后进行如下的操作;

首先使用qt-designer建立一个window.ui文件作为界面,和主程pyhton文件放在同目录下;

<!-- window.ui    注意这里面的两个关键字  button  hLayout  后台代码要用到  -->
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>526</width>
    <height>801</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>标题栏</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPlainTextEdit" name="textEdit">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>20</y>
      <width>401</width>
      <height>161</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="button">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>190</y>
      <width>191</width>
      <height>71</height>
     </rect>
    </property>
    <property name="text">
     <string>显示BOX</string>
    </property>
   </widget>
   <widget class="QWidget" name="horizontalLayoutWidget">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>280</y>
      <width>401</width>
      <height>201</height>
     </rect>
    </property>
    <layout class="QHBoxLayout" name="hLayout"/>
   </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>526</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

运行部分的代码采用类将ui部分逻辑包起来

首先看在pyside2环境下的情况

#pyocc_pyside2_ui.py
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox

from OCC.Display.backend import load_backend
load_backend("qt-pyside2")			#这里必须 填写关键字  qt-pyside2 qt-pyqt5  wx   根据环境选一个
from OCC.Display import qtDisplay

from PySide2.QtWidgets import QApplication, QMessageBox, QDialog, QMainWindow
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile
 
#记得继承 QMainWindow 或者 QDialog
class Stats(QMainWindow):

    def __init__(self):
        super().__init__()
        
        # 从文件中加载UI定义   这是加载的一种备用方式
        
        # qfile_stats = QFile("../ui/window_demo.ui")
        # qfile_stats.open(QFile.ReadOnly)
        # # qfile_stats.close()
        # self.ui = QUiLoader().load(qfile_stats)

        # 这里是直接加载的方式
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load('./window_demo.ui')
        
        #给按钮绑定建立BOX的动作
        self.ui.button.clicked.connect(self.displayBOX)

        self.canvas = qtDisplay.qtViewer3d(self)  	#这里初始化occ针对qt的显示
        self.ui.hLayout.addWidget(self.canvas)		#关键代码 将occ针对qt的显示 加载到控件
        self.canvas.resize(200, 200)
        self.canvas.InitDriver()		# canva的驱动,设置驱动后,才能成功display
        self.display = self.canvas._display

    #创建box模型
    def displayBOX(self):
        a_box = BRepPrimAPI_MakeBox(10.0, 20.0, 30.0).Shape()
        self.ais_box = self.display.DisplayShape(a_box)[0]
        self.display.FitAll()


app = QApplication([])
stats = Stats()
stats.ui.show() 
app.exec_()

再来看在pyqt5环境下的情况

#pyocc_pyqt5_ui.py
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox

from PyQt5.QtWidgets import QApplication, QMessageBox, QDialog, QMainWindow
# from PyQt5.QtUiTools import QUiLoader
from PyQt5 import uic		#这里和pyside2不同  官方的pyside命名是比较正规的
from PyQt5.QtCore import QFile

from OCC.Display.backend import load_backend
load_backend("qt-pyqt5")	#这里必须 填写关键字  qt-pyside2 qt-pyqt5  wx   根据环境选一个
from OCC.Display import qtDisplay

# from pyocc_ui_demo import ShowShape

class Stats(QDialog):

    def __init__(self):
        super().__init__()
        
        # 从文件中加载UI定义 这是加载的一种备用方式
        # qfile_stats = QFile("./window_demo.ui")
        # qfile_stats.open(QFile.ReadOnly)
        # qfile_stats.close()
        # self.ui = QUiLoader().load(qfile_stats)

        # 这里是直接加载的方式
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = uic.loadUi('./window_demo.ui')
		
        #给按钮绑定建立BOX的动作
        self.ui.button.clicked.connect(self.displayBOX)

        self.canvas = qtDisplay.qtViewer3d(self)	#这里初始化occ针对qt的显示  qtviewer3d
        self.ui.hLayout.addWidget(self.canvas)		#关键代码 将occ针对qt的显示 加载到控件
        self.canvas.resize(200, 200)
        self.canvas.InitDriver()
        self.display = self.canvas._display

    #OCC创建box模型
    def displayBOX(self):
        a_box = BRepPrimAPI_MakeBox(10.0, 20.0, 30.0).Shape()
        self.ais_box = self.display.DisplayShape(a_box)[0]
        self.display.FitAll()
     
app = QApplication([])
stats = Stats()
stats.ui.show()
# ShowShape()
app.exec_()

上述的python文件运行即可;出现结果:

 

使用PySide2创建一个Python为主的实时视频显示界面通常涉及到以下几个步骤: 1. **安装库**:首先需要安装PySide2和相关的视频处理库,如`opencv-python`用于读取和处理视频流。 ```bash pip install PySide2 opencv-python numpy ``` 2. **导入模块**:在Python脚本中,导入PySide2Qt核心模块以及所需的GUI部件和Opencv功能。 ```python from PySide2.QtWidgets import QApplication, QMainWindow, QLabel from PySide2.QtGui import QImage, QPixmap import cv2 ``` 3. **设置窗口**:创建一个主窗口,并在其上添加一个 QLabel 来显示视频帧。 ```python class VideoWindow(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.label = QLabel(self) self.setCentralWidget(self.label) # 其他布局和窗口属性可以在此处设定 ``` 4. **读取和显示视频**:在主函数中,通过摄像头或文件读取视频流,然后将每一帧转换为QImage对象并显示在 QLabel 上。 ```python def process_frame(frame): frame_qt = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888) # 转换 OpenCV 的 BGR 形式到 Qt 的 RGB pixmap = QPixmap.fromImage(frame_qt) self.label.setPixmap(pixmap) ``` 5. **视频循环**:使用 `cv2.VideoCapture` 和 `while True` 循环来持续从视频源获取新帧,并调用 `process_frame` 函数。 ```python def main(): app = QApplication([]) window = VideoWindow() cap = cv2.VideoCapture(0) # 从摄像头读取 while True: ret, frame = cap.read() if not ret: break process_frame(frame) cap.release() # 释放资源 app.exec_() # 显示窗口并运行事件循环 if __name__ == "__main__": main() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值