Commit 2ac40d5e by Yuhaibo

1

parent 307fb918
......@@ -517,7 +517,7 @@ class ModelSetHandler:
try:
# 获取模型目录路径
current_dir = Path(__file__).parent.parent.parent
model_dir = current_dir / "database" / "model" / "train_model"
model_dir = current_dir / "database" / "model" / "detection_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('.')
......
......@@ -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(True)
self.model_set_list.setAlternatingRowColors(False)
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(400))
center_widget.setMinimumWidth(scale_w(800))
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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment