initial fluent-widgets ui

This commit is contained in:
2025-08-14 18:45:16 +08:00
parent 746e83ab23
commit 4c66886257
1198 changed files with 805339 additions and 0 deletions

336
app/view/data_interface.py Normal file
View File

@ -0,0 +1,336 @@
# coding:utf-8
from PySide6.QtCore import Qt, QEasingCurve, QTimer
from PySide6.QtGui import QColor, QImage, QPixmap
from PySide6.QtWidgets import QWidget, QStackedWidget, QVBoxLayout, QLabel, QHBoxLayout, QFrame, QSizePolicy
from qfluentwidgets import (Pivot, qrouter, SegmentedWidget, TabBar, CheckBox, ComboBox,
TabCloseButtonDisplayMode, BodyLabel, SpinBox, BreadcrumbBar,
SegmentedToggleToolWidget, FluentIcon, LineEdit, PrimaryPushButton, PillPushButton, DisplayLabel)
from .gallery_interface import GalleryInterface
from ..common.translator import Translator
from ..common.style_sheet import StyleSheet
import cv2
class DataInterface(GalleryInterface):
""" Navigation view interface """
def __init__(self, parent=None):
t = Translator()
super().__init__(
title=t.navigation,
subtitle="qfluentwidgets.components.navigation",
parent=parent
)
self.setObjectName('dataInterface')
# breadcrumb bar
card = self.addExampleCard(
title=self.tr(''),
widget=TabInterface(self),
sourcePath='https://github.com/zhiyiYo/PyQt-Fluent-Widgets/blob/PySide6/examples/navigation/tab_view/demo.py',
stretch=1
)
card.topLayout.setContentsMargins(12, 0, 0, 0)
def createToggleToolWidget(self):
w = SegmentedToggleToolWidget(self)
w.addItem('k1', FluentIcon.TRANSPARENT)
w.addItem('k2', FluentIcon.CHECKBOX)
w.addItem('k3', FluentIcon.CONSTRACT)
w.setCurrentItem('k1')
return w
class TabInterface(QWidget):
""" Tab interface """
def __init__(self, parent=None):
super().__init__(parent=parent)
self.tabCount = 1
# self.tabBar = TabBar(self)
# self.stackedWidget = QStackedWidget(self)
self.tabView = QWidget(self)
self.controlPanel = QFrame(self)
#self.movableCheckBox = CheckBox(self.tr('IsTabMovable'), self)
#self.scrollableCheckBox = CheckBox(self.tr('IsTabScrollable'), self)
#self.shadowEnabledCheckBox = CheckBox(self.tr('IsTabShadowEnabled'), self)
#self.tabMaxWidthLabel = BodyLabel(self.tr('TabMaximumWidth'), self)
# self.tabMaxWidthSpinBox = SpinBox(self)
#self.closeDisplayModeLabel = BodyLabel(self.tr('TabCloseButtonDisplayMode'), self)
#self.closeDisplayModeComboBox = ComboBox(self)
self.hBoxLayout = QHBoxLayout(self)
######################界面1
self.video_label1 = QLabel()
self.video_label1.setFixedHeight(500)
# self.vBoxLayout.addWidget(self.video_label1)
# 使用 OpenCV 读取视频
self.cap1 = cv2.VideoCapture("./app/resource/video/test.mp4") # 替换为你的视频路径
if not self.cap1.isOpened():
print("无法打开视频文件!")
return
# 使用 QTimer 定时更新视频帧
self.timer1 = QTimer()
self.timer1.timeout.connect(self.update_frame1)
self.timer1.start(30) # 30ms 更新一帧(约 33 FPS
######################界面2
self.video_label2 = QLabel()
self.video_label2.setFixedHeight(500)
# self.vBoxLayout.addWidget(self.video_label1)
# 使用 OpenCV 读取视频
self.cap2 = cv2.VideoCapture("./app/resource/video/test.mp4") # 替换为你的视频路径
if not self.cap2.isOpened():
print("无法打开视频文件!")
return
# 使用 QTimer 定时更新视频帧
self.timer2 = QTimer()
self.timer2.timeout.connect(self.update_frame2)
self.timer2.start(30) # 30ms 更新一帧(约 33 FPS
#操作按钮1
self.lineEdit1 = LineEdit()
# 设置提示文本
self.lineEdit1.setPlaceholderText("请输入存储路径")
# 设置文本
self.lineEdit1.setText("/userdata/camera01")
# print(self.lineEdit1.text())
# 启用清空按钮
self.lineEdit1.setClearButtonEnabled(True)
#操作按钮2
self.lineEdit2 = LineEdit()
# 设置提示文本
self.lineEdit2.setPlaceholderText("请输入存储路径")
# 设置文本
self.lineEdit2.setText("/userdata/camera02")
# print(self.lineEdit1.text())
# 启用清空按钮
self.lineEdit2.setClearButtonEnabled(True)
#启动按钮1
self.start_button1=PrimaryPushButton(FluentIcon.PLAY, '开始采集')
#停止按钮1
self.stop_button1=PrimaryPushButton(FluentIcon.PAUSE, '停止采集')
#启动按钮2
self.start_button2=PrimaryPushButton(FluentIcon.PLAY, '开始采集')
#停止按钮2
self.stop_button2=PrimaryPushButton(FluentIcon.PAUSE, '停止采集')
# Displaylabel
self.label1 = DisplayLabel("存储路径")
self.label2 = DisplayLabel("存储路径")
self.label3 = DisplayLabel("")
self.label4 = DisplayLabel("")
#hBoxLayout
self.hcontainer1 = QWidget()
self.hBoxLayout1 = QHBoxLayout(self.hcontainer1)
self.hBoxLayout1.addWidget(self.label1)
self.hBoxLayout1.addWidget(self.lineEdit1)
self.hcontainer2 = QWidget()
self.hBoxLayout2 = QHBoxLayout(self.hcontainer2)
self.hBoxLayout2.addWidget(self.label2)
self.hBoxLayout2.addWidget(self.lineEdit2)
#布局
self.container1 = QWidget()
self.hBoxLayout1 = QVBoxLayout(self.container1)
self.hBoxLayout1.addWidget(self.video_label1)
self.hBoxLayout1.addWidget(self.hcontainer1)
self.hBoxLayout1.addWidget(self.start_button1)
self.hBoxLayout1.addWidget(self.stop_button1)
self.container1.setMaximumSize(400, 500)
self.container1.setMinimumSize(300, 200)
self.container2 = QWidget()
self.hBoxLayout2 = QVBoxLayout(self.container2)
self.hBoxLayout2.addWidget(self.video_label2)
self.hBoxLayout2.addWidget(self.hcontainer2)
self.hBoxLayout2.addWidget(self.start_button2)
self.hBoxLayout2.addWidget(self.stop_button2)
self.container2.setMaximumSize(400, 500)
self.container2.setMinimumSize(300, 200)
#左边 self.vBoxLayout 右边 self.panelLayout
# self.vBoxLayout = QVBoxLayout(self.tabView)
# self.panelLayout = QVBoxLayout(self.controlPanel)
# self.songInterface = QLabel('Song Interface', self)
# self.albumInterface = QLabel('Album Interface', self)
# self.artistInterface = QLabel('Artist Interface', self)
# add items to pivot
# self.__initWidget()
self.hBoxLayout.addWidget(self.container1)
self.hBoxLayout.addWidget(self.container2)
def __initWidget(self):
self.initLayout()
# self.shadowEnabledCheckBox.setChecked(True)
# self.tabMaxWidthSpinBox.setRange(60, 400)
#self.tabMaxWidthSpinBox.setValue(self.tabBar.tabMaximumWidth())
# self.closeDisplayModeComboBox.addItem(self.tr('Always'), userData=TabCloseButtonDisplayMode.ALWAYS)
# self.closeDisplayModeComboBox.addItem(self.tr('OnHover'), userData=TabCloseButtonDisplayMode.ON_HOVER)
# self.closeDisplayModeComboBox.addItem(self.tr('Never'), userData=TabCloseButtonDisplayMode.NEVER)
# self.closeDisplayModeComboBox.currentIndexChanged.connect(self.onDisplayModeChanged)
# self.addSubInterface(self.songInterface,
# 'tabSongInterface', self.tr('Song'), ':/gallery/images/MusicNote.png')
# self.addSubInterface(self.albumInterface,
# 'tabAlbumInterface', self.tr('Album'), ':/gallery/images/Dvd.png')
# self.addSubInterface(self.artistInterface,
# 'tabArtistInterface', self.tr('Artist'), ':/gallery/images/Singer.png')
self.controlPanel.setObjectName('controlPanel')
StyleSheet.NAVIGATION_VIEW_INTERFACE.apply(self)
#self.connectSignalToSlot()
# qrouter.setDefaultRouteKey(
# self.stackedWidget, self.songInterface.objectName())
# def connectSignalToSlot(self):
# self.movableCheckBox.stateChanged.connect(
# lambda: self.tabBar.setMovable(self.movableCheckBox.isChecked()))
# self.scrollableCheckBox.stateChanged.connect(
# lambda: self.tabBar.setScrollable(self.scrollableCheckBox.isChecked()))
# self.shadowEnabledCheckBox.stateChanged.connect(
# lambda: self.tabBar.setTabShadowEnabled(self.shadowEnabledCheckBox.isChecked()))
#self.tabMaxWidthSpinBox.valueChanged.connect(self.tabBar.setTabMaximumWidth)
# self.tabBar.tabAddRequested.connect(self.addTab)
# self.tabBar.tabCloseRequested.connect(self.removeTab)
# self.stackedWidget.currentChanged.connect(self.onCurrentIndexChanged)
def initLayout(self):
# self.tabBar.setTabMaximumWidth(200)
self.setFixedHeight(450)
self.controlPanel.setFixedWidth(220)
self.hBoxLayout.addWidget(self.tabView, 1)
self.hBoxLayout.addWidget(self.controlPanel, 0, Qt.AlignRight)
self.hBoxLayout.setContentsMargins(0, 0, 0, 0)
#self.vBoxLayout.addWidget(self.tabBar)
# self.vBoxLayout.addWidget(self.stackedWidget)
self.vBoxLayout.setContentsMargins(0, 0, 0, 0)
self.panelLayout.setSpacing(8)
self.panelLayout.setContentsMargins(14, 16, 14, 14)
self.panelLayout.setAlignment(Qt.AlignTop)
# self.panelLayout.addWidget(self.movableCheckBox)
# self.panelLayout.addWidget(self.scrollableCheckBox)
# self.panelLayout.addWidget(self.shadowEnabledCheckBox)
self.panelLayout.addSpacing(4)
# self.panelLayout.addWidget(self.tabMaxWidthLabel)
# self.panelLayout.addWidget(self.tabMaxWidthSpinBox)
self.panelLayout.addSpacing(4)
# self.panelLayout.addWidget(self.closeDisplayModeLabel)
# self.panelLayout.addWidget(self.closeDisplayModeComboBox)
######################界面1
self.video_label1 = QLabel()
# self.vBoxLayout.addWidget(self.video_label1)
# 使用 OpenCV 读取视频
self.cap1 = cv2.VideoCapture("./app/resource/video/test.mp4") # 替换为你的视频路径
if not self.cap1.isOpened():
print("无法打开视频文件!")
return
# 使用 QTimer 定时更新视频帧
self.timer1 = QTimer()
self.timer1.timeout.connect(self.update_frame1)
self.timer1.start(30) # 30ms 更新一帧(约 33 FPS
######################界面2
# self.video_label2 = QLabel()
# self.vBoxLayout.addWidget(self.video_label2)
# # 使用 OpenCV 读取视频
# self.cap2 = cv2.VideoCapture("./app/resource/video/test.mp4") # 替换为你的视频路径
# if not self.cap2.isOpened():
# print("无法打开视频文件!")
# return
# # 使用 QTimer 定时更新视频帧
# self.timer2 = QTimer()
# self.timer2.timeout.connect(self.update_frame2)
# self.timer2.start(30) # 30ms 更新一帧(约 33 FPS
#self.vBoxLayout.addWidget(self.video_label1)
self.panelLayout.addWidget(self.video_label1)
def addSubInterface(self, widget: QLabel, objectName, text, icon):
widget.setObjectName(objectName)
widget.setAlignment(Qt.AlignTop | Qt.AlignLeft)
# self.stackedWidget.addWidget(widget)
# self.tabBar.addTab(
# routeKey=objectName,
# text=text,
# icon=icon,
# onClick=lambda: self.stackedWidget.setCurrentWidget(widget)
# )
# def onDisplayModeChanged(self, index):
# mode = self.closeDisplayModeComboBox.itemData(index)
# self.tabBar.setCloseButtonDisplayMode(mode)
# def onCurrentIndexChanged(self, index):
# widget = self.stackedWidget.widget(index)
# if not widget:
# return
# self.tabBar.setCurrentTab(widget.objectName())
# qrouter.push(self.stackedWidget, widget.objectName())
def update_frame1(self):
ret, frame = self.cap1.read()
if not ret:
self.timer1.stop()
self.cap1.release()
return
# 转换 OpenCV BGR 格式为 RGB并调整大小以适应 QLabel
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = frame.shape
bytes_per_line = ch * w
q_img = QImage(frame.data, w, h, bytes_per_line, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(q_img)
self.video_label1.setPixmap(pixmap.scaled(self.video_label1.size())) # 自适应窗口大小
def update_frame2(self):
ret, frame = self.cap2.read()
if not ret:
self.timer2.stop()
self.cap2.release()
return
# 转换 OpenCV BGR 格式为 RGB并调整大小以适应 QLabel
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = frame.shape
bytes_per_line = ch * w
q_img = QImage(frame.data, w, h, bytes_per_line, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(q_img)
self.video_label2.setPixmap(pixmap.scaled(self.video_label2.size())) # 自适应窗口大小