134 lines
4.8 KiB
Python
134 lines
4.8 KiB
Python
from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
|
QLineEdit, QPushButton, QLabel, QComboBox,
|
|
QProgressBar, QTextEdit, QFrame, QFileDialog)
|
|
from PySide6.QtCore import Qt, Signal
|
|
|
|
class DropZone(QFrame):
|
|
file_dropped = Signal(str)
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.setAcceptDrops(True)
|
|
self.file_selected = None
|
|
self.setMinimumSize(400, 200)
|
|
self.setStyleSheet("""
|
|
QFrame {
|
|
border: 2px dashed #aaa;
|
|
border-radius: 8px;
|
|
background-color: #fafafa;
|
|
}
|
|
QFrame:hover {
|
|
border-color: #3498db;
|
|
background-color: #ecf0f1;
|
|
}
|
|
""")
|
|
|
|
def dragEnterEvent(self, event):
|
|
if event.mimeData().hasUrls():
|
|
event.acceptProposedAction()
|
|
self.setStyleSheet("""
|
|
QFrame {
|
|
border: 2px dashed #3498db;
|
|
border-radius: 8px;
|
|
background-color: #d5e8f7;
|
|
}
|
|
""")
|
|
|
|
def dragLeaveEvent(self, event):
|
|
self.setStyleSheet("""
|
|
QFrame {
|
|
border: 2px dashed #aaa;
|
|
border-radius: 8px;
|
|
background-color: #fafafa;
|
|
}
|
|
""")
|
|
|
|
def dropEvent(self, event):
|
|
if event.mimeData().hasUrls():
|
|
urls = event.mimeData().urls()
|
|
if urls:
|
|
self.file_selected = urls[0].toLocalFile()
|
|
event.acceptProposedAction()
|
|
self.file_dropped.emit(self.file_selected)
|
|
|
|
def mousePressEvent(self, event):
|
|
filepath, _ = QFileDialog.getOpenFileName(self, "选择文件")
|
|
if filepath:
|
|
self.file_selected = filepath
|
|
self.file_dropped.emit(filepath)
|
|
|
|
class UiCreator:
|
|
@staticmethod
|
|
def create_main_ui(window):
|
|
window.setWindowTitle("临时文件传输客户端")
|
|
window.setMinimumSize(400, 350)
|
|
window.resize(500, 450)
|
|
|
|
central_widget = QWidget()
|
|
window.setCentralWidget(central_widget)
|
|
layout = QVBoxLayout(central_widget)
|
|
layout.setContentsMargins(20, 20, 20, 20)
|
|
layout.setSpacing(15)
|
|
|
|
server_layout = QHBoxLayout()
|
|
server_label = QLabel("服务器:")
|
|
window.server_input = QLineEdit("http://localhost:5000")
|
|
window.save_btn = QPushButton("保存")
|
|
window.save_btn.setFixedWidth(60)
|
|
server_layout.addWidget(server_label)
|
|
server_layout.addWidget(window.server_input)
|
|
server_layout.addWidget(window.save_btn)
|
|
layout.addLayout(server_layout)
|
|
|
|
window.drop_zone = DropZone(window)
|
|
window.drop_label = QLabel("📁 拖放文件到此处\n或点击选择文件")
|
|
window.drop_label.setAlignment(Qt.AlignCenter)
|
|
drop_layout = QVBoxLayout(window.drop_zone)
|
|
drop_layout.addWidget(window.drop_label)
|
|
layout.addWidget(window.drop_zone)
|
|
|
|
action_layout = QHBoxLayout()
|
|
expiry_label = QLabel("过期时间:")
|
|
window.expiry_combo = QComboBox()
|
|
window.expiry_combo.addItems(["1h", "24h", "7d"])
|
|
window.expiry_combo.setCurrentText("24h")
|
|
window.upload_btn = QPushButton("上传文件")
|
|
window.upload_btn.setFixedWidth(100)
|
|
action_layout.addWidget(expiry_label)
|
|
action_layout.addWidget(window.expiry_combo)
|
|
action_layout.addStretch()
|
|
action_layout.addWidget(window.upload_btn)
|
|
layout.addLayout(action_layout)
|
|
|
|
window.progress_bar = QProgressBar()
|
|
window.progress_bar.setVisible(False)
|
|
window.progress_bar.setTextVisible(True)
|
|
layout.addWidget(window.progress_bar)
|
|
|
|
window.result_area = QTextEdit()
|
|
window.result_area.setVisible(False)
|
|
window.result_area.setReadOnly(True)
|
|
window.result_area.setMaximumHeight(80)
|
|
window.result_area.setStyleSheet("""
|
|
QTextEdit {
|
|
background-color: #f0f0f0;
|
|
border: 1px solid #ddd;
|
|
border-radius: 4px;
|
|
padding: 8px;
|
|
}
|
|
""")
|
|
layout.addWidget(window.result_area)
|
|
|
|
window.copy_btn = QPushButton("复制链接")
|
|
window.copy_btn.setVisible(False)
|
|
window.copy_btn.setFixedWidth(80)
|
|
copy_layout = QHBoxLayout()
|
|
copy_layout.addStretch()
|
|
copy_layout.addWidget(window.copy_btn)
|
|
layout.addLayout(copy_layout)
|
|
|
|
window.status_label = QLabel("状态: 就绪")
|
|
window.status_label.setStyleSheet("color: #666; font-size: 12px;")
|
|
layout.addWidget(window.status_label)
|
|
|
|
return central_widget |