ImgGPS2KML/自动归类/ui.py

195 lines
7.3 KiB
Python

from PySide6.QtWidgets import (
QApplication,
QFileDialog,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
QListView,
QAbstractItemView,
QTreeView,
QTableView,
QLabel,
QLineEdit,
QHBoxLayout,
QMessageBox,
QProgressBar, # 导入 QProgressBar 类
)
from PySide6.QtWidgets import QHeaderView
from PySide6.QtGui import QStandardItemModel, QStandardItem
from PySide6.QtCore import Slot # 导入 Slot 装饰器
import core
class FolderSelectorApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("照片整理")
self.setGeometry(100, 100, 600, 400)
# 创建按钮
# TODO: 暂时不用选择文件夹按钮
self.select_folders_button = QPushButton("选择多个文件夹", None)
self.select_folders_button.clicked.connect(self.select_folders)
self.select_files_button = QPushButton("选择多个文件", self)
self.select_files_button.clicked.connect(self.select_files)
# 整理照片按钮
self.arrage_button = QPushButton("开始整理", self)
self.arrage_button.clicked.connect(self.arrage_pic)
# 创建文件开始计数
self.start_index_label = QLabel("目录开始基数:", self)
self.start_index_text = QLineEdit(self)
self.start_index_text.setText("0")
# 创建QTableView
self.table_view = QTableView(self)
self.model = QStandardItemModel(0, 2, self)
self.model.setHorizontalHeaderLabels(["文件夹名称", "路径"])
self.table_view.setModel(self.model)
self.table_view.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)
self.table_view.setColumnWidth(0, int(self.width() * 0.3))
self.table_view.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
# 创建进度条
self.progress_bar = QProgressBar(self)
self.progress_bar.setValue(0)
# 布局
# 设置计数的布局
start_index_layout = QHBoxLayout()
start_index_layout.addWidget(self.start_index_label)
start_index_layout.addWidget(self.start_index_text)
start_index_layout.addStretch(2)
# 选择文件的布局
layout = QVBoxLayout()
# layout.addWidget(self.select_folders_button)
layout.addLayout(start_index_layout)
layout.addWidget(self.select_files_button)
layout.addWidget(self.arrage_button)
layout.addWidget(self.table_view)
layout.addWidget(self.progress_bar) # 添加进度条到布局
container = QWidget(self)
# container.setLayout(start_index_layout)
container.setLayout(layout)
# container.layout.addLayout(start_index_layout)
self.setCentralWidget(container)
self.worker = None # 初始化 worker 为 None
def select_folders(self):
# 打开文件夹选择对话框,允许多选
dialog = QFileDialog(self)
dialog.setWindowTitle("请选择多个文件夹")
dialog.setFileMode(QFileDialog.Directory) # 设置为目录选择模式
dialog.setOption(
QFileDialog.DontUseNativeDialog, True
) # 使用Qt对话框以支持多选
dialog.setOption(QFileDialog.ShowDirsOnly, True) # 只显示文件夹
dialog.setOption(QFileDialog.DontResolveSymlinks, True) # 不解析符号链接
# 设置列表视图和树视图为多选模式
for view in dialog.findChildren(QListView) + dialog.findChildren(QTreeView):
view.setSelectionMode(QAbstractItemView.ExtendedSelection)
# 设置样式表,使选中项的背景色为蓝色
view.setStyleSheet(
"""QAbstractItemView::item:selected {
background-color: #0078D7;
color: white;
}
QAbstractItemView::item:selected:!active {
background-color: #CCE8FF;
color: black;
}"""
)
if dialog.exec():
folder_paths = dialog.selectedFiles() # 获取选择的文件夹路径
print("选择的文件夹路径:", folder_paths)
# 清空当前模型
self.model.removeRows(0, self.model.rowCount())
# 添加新的文件夹路径到模型
for path in folder_paths:
folder_name = (
path.split("/")[-1] if "/" in path else path.split("\\")[-1]
)
name_item = QStandardItem(folder_name)
path_item = QStandardItem(path)
self.model.appendRow([name_item, path_item])
@Slot(int) # 使用 Slot 装饰器
def update_progress(self, value):
"""更新进度条的值"""
self.progress_bar.setValue(value)
def arrage_pic(self):
# 获取table_view中第一列的数据
name_list = []
for row in range(self.model.rowCount()):
item = self.model.item(row, 1)
if item is not None:
name_list.append(item.text())
if len(name_list) == 0:
QMessageBox.warning(self, "警告", "请选择文件!")
return
# 设置进度条的最大值
self.progress_bar.setMaximum(len(name_list))
self.progress_bar.setValue(0)
# 创建 Worker 实例
self.worker = core.Worker(
name_list, start_index=int(self.start_index_text.text())
)
self.worker.progress.connect(self.update_progress) # 连接信号到槽函数
self.worker.finished.connect(self.worker.deleteLater) # 任务完成后删除 worker
self.worker.start() # 启动线程
def resizeEvent(self, event):
super().resizeEvent(event)
self.table_view.setColumnWidth(0, int(self.width() * 0.3))
def select_files(self):
# 打开文件选择对话框,允许多选
dialog = QFileDialog(self)
dialog.setWindowTitle("请选择多个文件")
dialog.setFileMode(QFileDialog.ExistingFiles) # 设置为文件选择模式
dialog.setOption(
QFileDialog.DontUseNativeDialog, False
) # 使用Qt对话框以支持多选
# 设置列表视图和树视图为多选模式
for view in dialog.findChildren(QListView) + dialog.findChildren(QTreeView):
view.setSelectionMode(QAbstractItemView.ExtendedSelection)
# 设置样式表,使选中项的背景色为蓝色
view.setStyleSheet(
"""QAbstractItemView::item:selected {
background-color: #0078D7;
color: white;
}
QAbstractItemView::item:selected:!active {
background-color: #CCE8FF;
color: black;
}"""
)
if dialog.exec():
file_paths = dialog.selectedFiles() # 获取选择的文件路径
print("选择的文件路径:", file_paths)
# 清空当前模型
self.model.removeRows(0, self.model.rowCount())
# 添加新的文件路径到模型
for path in file_paths:
file_name = path.split("/")[-1] if "/" in path else path.split("\\")[-1]
name_item = QStandardItem(file_name)
path_item = QStandardItem(path)
self.model.appendRow([name_item, path_item])