Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
Oil_Level_Recognition_System
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
柳青君
Oil_Level_Recognition_System
Commits
2ac40d5e
Commit
2ac40d5e
authored
Nov 27, 2025
by
Yuhaibo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1
parent
307fb918
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
36 deletions
+64
-36
model_set_handler.py
handlers/modelpage/model_set_handler.py
+16
-27
modelset_page.py
widgets/modelpage/modelset_page.py
+48
-9
No files found.
handlers/modelpage/model_set_handler.py
View file @
2ac40d5e
...
...
@@ -517,7 +517,7 @@ class ModelSetHandler:
try
:
# 获取模型目录路径
current_dir
=
Path
(
__file__
)
.
parent
.
parent
.
parent
model_dir
=
current_dir
/
"database"
/
"model"
/
"
trai
n_model"
model_dir
=
current_dir
/
"database"
/
"model"
/
"
detectio
n_model"
print
(
f
"[模型扫描] 扫描目录: {model_dir}"
)
...
...
@@ -527,31 +527,26 @@ class ModelSetHandler:
print
(
f
"[模型扫描] 目录存在: {model_dir.exists()}"
)
#
按数字排序子目录(降序,最新的在前
)
#
扫描所有子目录(数字和非数字
)
all_subdirs
=
[
d
for
d
in
model_dir
.
iterdir
()
if
d
.
is_dir
()]
print
(
f
"[模型扫描] 找到子目录数量: {len(all_subdirs)}"
)
print
(
f
"[模型扫描] 子目录列表: {[d.name for d in all_subdirs]}"
)
# 分离数字目录和非数字目录
digit_subdirs
=
[
d
for
d
in
all_subdirs
if
d
.
name
.
isdigit
()]
print
(
f
"[模型扫描] 数字子目录数量: {len(digit_subdirs)}"
)
non_digit_subdirs
=
[
d
for
d
in
all_subdirs
if
not
d
.
name
.
isdigit
()]
sorted_subdirs
=
sorted
(
digit_subdirs
,
key
=
lambda
x
:
int
(
x
.
name
),
reverse
=
True
)
print
(
f
"[模型扫描] 数字子目录: {[d.name for d in sorted_subdirs]}"
)
# 数字目录按数字降序排序,非数字目录按字母排序
sorted_digit_subdirs
=
sorted
(
digit_subdirs
,
key
=
lambda
x
:
int
(
x
.
name
),
reverse
=
True
)
sorted_non_digit_subdirs
=
sorted
(
non_digit_subdirs
,
key
=
lambda
x
:
x
.
name
)
# 合并:数字目录在前,非数字目录在后
sorted_subdirs
=
sorted_digit_subdirs
+
sorted_non_digit_subdirs
print
(
f
"[模型扫描] 排序后的子目录: {[d.name for d in sorted_subdirs]}"
)
for
subdir
in
sorted_subdirs
:
print
(
f
"[模型扫描] 处理子目录: {subdir.name}"
)
# 尝试读取 config.yaml 获取详细信息
config_file
=
subdir
/
"config.yaml"
model_config
=
None
if
config_file
.
exists
():
try
:
with
open
(
config_file
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
model_config
=
yaml
.
safe_load
(
f
)
except
Exception
as
e
:
print
(
f
"[模型扫描] 读取config.yaml失败: {e}"
)
# 检查是否有weights子目录(优先检查train/weights,然后weights)
train_weights_dir
=
subdir
/
"train"
/
"weights"
weights_dir
=
subdir
/
"weights"
...
...
@@ -610,17 +605,11 @@ class ModelSetHandler:
# 如果找到了模型文件,添加到列表
if
selected_model
:
# 从 config.yaml 获取信息,或使用默认值
if
model_config
:
model_name
=
model_config
.
get
(
'name'
,
f
"训练模型-{subdir.name}"
)
description
=
model_config
.
get
(
'description'
,
''
)
training_date
=
model_config
.
get
(
'training_date'
,
''
)
epochs
=
model_config
.
get
(
'epochs'
,
''
)
else
:
model_name
=
selected_model
.
stem
# 使用文件名(不含扩展名)作为模型名
description
=
f
"来自目录 {subdir.name}"
training_date
=
''
epochs
=
''
# 使用"文件夹名称/模型文件名"格式
model_name
=
f
"{subdir.name}/{selected_model.stem}"
description
=
f
"来自目录 {subdir.name}"
training_date
=
''
epochs
=
''
# 获取文件格式
file_ext
=
selected_model
.
suffix
.
lstrip
(
'.'
)
...
...
widgets/modelpage/modelset_page.py
View file @
2ac40d5e
...
...
@@ -245,11 +245,17 @@ class ModelSetPage(QtWidgets.QWidget):
content_layout
.
addWidget
(
left_widget
)
# ========== 中间主内容区(
模型列表
) ==========
# ========== 中间主内容区(
左右分栏:模型列表 + 文本显示
) ==========
center_widget
=
QtWidgets
.
QWidget
()
center_layout
=
QtWidgets
.
QVBoxLayout
(
center_widget
)
center_layout
.
setContentsMargins
(
0
,
0
,
0
,
0
)
center_layout
.
setSpacing
(
8
)
center_main_layout
=
QtWidgets
.
QHBoxLayout
(
center_widget
)
center_main_layout
.
setContentsMargins
(
0
,
0
,
0
,
0
)
center_main_layout
.
setSpacing
(
8
)
# ===== 左侧:模型列表区域 =====
left_list_widget
=
QtWidgets
.
QWidget
()
left_list_layout
=
QtWidgets
.
QVBoxLayout
(
left_list_widget
)
left_list_layout
.
setContentsMargins
(
0
,
0
,
0
,
0
)
left_list_layout
.
setSpacing
(
8
)
# 搜索栏(简约样式)
search_layout
=
QtWidgets
.
QHBoxLayout
()
...
...
@@ -274,16 +280,15 @@ class ModelSetPage(QtWidgets.QWidget):
self
.
search_input
.
textChanged
.
connect
(
self
.
_filterModels
)
search_layout
.
addWidget
(
self
.
search_input
)
center
_layout
.
addLayout
(
search_layout
)
left_list
_layout
.
addLayout
(
search_layout
)
# 模型列表(简约labelme样式)
self
.
model_set_list
=
QtWidgets
.
QListWidget
()
self
.
model_set_list
.
setAlternatingRowColors
(
Tru
e
)
self
.
model_set_list
.
setAlternatingRowColors
(
Fals
e
)
self
.
model_set_list
.
setStyleSheet
(
"""
QListWidget {
border: 1px solid #ccc;
background-color: white;
alternate-background-color: #f5f5f5;
outline: none;
}
QListWidget::item {
...
...
@@ -308,10 +313,41 @@ class ModelSetPage(QtWidgets.QWidget):
self
.
model_set_list
.
setContextMenuPolicy
(
Qt
.
CustomContextMenu
)
# 安装事件过滤器以捕获空白区域点击
self
.
model_set_list
.
viewport
()
.
installEventFilter
(
self
)
center_layout
.
addWidget
(
self
.
model_set_list
)
left_list_layout
.
addWidget
(
self
.
model_set_list
)
# ===== 右侧:文本显示区域 =====
right_text_widget
=
QtWidgets
.
QWidget
()
right_text_layout
=
QtWidgets
.
QVBoxLayout
(
right_text_widget
)
right_text_layout
.
setContentsMargins
(
0
,
0
,
0
,
0
)
right_text_layout
.
setSpacing
(
8
)
# 文本显示区域标题
text_title_label
=
QtWidgets
.
QLabel
(
"模型信息"
)
FontManager
.
applyToWidget
(
text_title_label
)
text_title_label
.
setStyleSheet
(
"font-weight: bold; padding: 4px;"
)
right_text_layout
.
addWidget
(
text_title_label
)
# 文本显示框
self
.
model_info_text
=
QtWidgets
.
QTextEdit
()
self
.
model_info_text
.
setReadOnly
(
True
)
self
.
model_info_text
.
setStyleSheet
(
"""
QTextEdit {
border: 1px solid #ccc;
background-color: white;
font-family: Consolas, Monaco, monospace;
font-size: 10pt;
}
"""
)
self
.
model_info_text
.
setPlaceholderText
(
"选择模型后将显示模型文件夹内的txt文件内容..."
)
FontManager
.
applyToWidget
(
self
.
model_info_text
)
right_text_layout
.
addWidget
(
self
.
model_info_text
)
# 将左右两部分添加到中间主布局(1:1比例)
center_main_layout
.
addWidget
(
left_list_widget
,
1
)
center_main_layout
.
addWidget
(
right_text_widget
,
1
)
# 🔥 设置中间区域的宽度(主要内容区)- 响应式布局
center_widget
.
setMinimumWidth
(
scale_w
(
4
00
))
center_widget
.
setMinimumWidth
(
scale_w
(
8
00
))
content_layout
.
addWidget
(
center_widget
,
3
)
...
...
@@ -603,6 +639,9 @@ class ModelSetPage(QtWidgets.QWidget):
# 移除"(默认)"标记,获取实际的模型名称
model_name
=
display_name
.
replace
(
"(默认)"
,
""
)
.
strip
()
# 读取并显示模型文件夹内的txt文件
self
.
_loadModelTxtFiles
(
model_name
)
# 发射信号通知外部模型已被选中
self
.
modelSetClicked
.
emit
(
display_name
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment