🐛 修復GUI重複貼上圖片的問題

This commit is contained in:
Minidoracat 2025-06-05 05:46:47 +08:00
parent 30f8c2c1a3
commit 5f6e8d1eef
4 changed files with 24 additions and 25 deletions

View File

@ -17,7 +17,6 @@ from ..window.config_manager import ConfigManager
class FeedbackTab(QWidget): class FeedbackTab(QWidget):
"""回饋分頁組件""" """回饋分頁組件"""
image_paste_requested = Signal()
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
@ -80,6 +79,17 @@ class FeedbackTab(QWidget):
} }
""") """)
# 創建圖片上傳區域(需要先創建以便連接信號)
image_upload_widget = QWidget()
image_upload_widget.setMinimumHeight(200) # 進一步增加最小高度
image_upload_widget.setMaximumHeight(320) # 增加最大高度
image_upload_layout = QVBoxLayout(image_upload_widget)
image_upload_layout.setSpacing(8)
image_upload_layout.setContentsMargins(0, 8, 0, 0) # 與回饋輸入區域保持一致的邊距
self.image_upload = ImageUploadWidget(config_manager=self.config_manager)
image_upload_layout.addWidget(self.image_upload, 1)
# 回饋輸入區域 # 回饋輸入區域
self.feedback_input = SmartTextEdit() self.feedback_input = SmartTextEdit()
placeholder_text = t('feedback.placeholder').replace("Ctrl+Enter", "Ctrl+Enter/Cmd+Enter").replace("Ctrl+V", "Ctrl+V/Cmd+V") placeholder_text = t('feedback.placeholder').replace("Ctrl+Enter", "Ctrl+Enter/Cmd+Enter").replace("Ctrl+V", "Ctrl+V/Cmd+V")
@ -96,18 +106,8 @@ class FeedbackTab(QWidget):
line-height: 1.4; line-height: 1.4;
} }
""") """)
self.feedback_input.image_paste_requested.connect(self.image_paste_requested) # 直接連接文字輸入框的圖片貼上信號到圖片上傳組件
self.feedback_input.image_paste_requested.connect(self.image_upload.paste_from_clipboard)
# 圖片上傳區域(確保固定高度和滾動支持)
image_upload_widget = QWidget()
image_upload_widget.setMinimumHeight(200) # 進一步增加最小高度
image_upload_widget.setMaximumHeight(320) # 增加最大高度
image_upload_layout = QVBoxLayout(image_upload_widget)
image_upload_layout.setSpacing(8)
image_upload_layout.setContentsMargins(0, 8, 0, 0) # 與回饋輸入區域保持一致的邊距
self.image_upload = ImageUploadWidget(config_manager=self.config_manager)
image_upload_layout.addWidget(self.image_upload, 1)
# 添加到分割器 # 添加到分割器
feedback_splitter.addWidget(self.feedback_input) feedback_splitter.addWidget(self.feedback_input)
@ -161,10 +161,6 @@ class FeedbackTab(QWidget):
if hasattr(self, 'image_upload'): if hasattr(self, 'image_upload'):
self.image_upload.update_texts() self.image_upload.update_texts()
def handle_image_paste_from_textarea(self) -> None:
"""處理從文字框智能貼上圖片的功能"""
self.image_upload.paste_from_clipboard()
def _save_feedback_splitter_position(self, splitter: QSplitter) -> None: def _save_feedback_splitter_position(self, splitter: QSplitter) -> None:
"""保存分割器的位置""" """保存分割器的位置"""

View File

@ -36,6 +36,7 @@ class ImageUploadWidget(QWidget):
super().__init__(parent) super().__init__(parent)
self.images: Dict[str, Dict[str, str]] = {} self.images: Dict[str, Dict[str, str]] = {}
self.config_manager = config_manager self.config_manager = config_manager
self._last_paste_time = 0 # 添加最後貼上時間記錄
self._setup_ui() self._setup_ui()
self.setAcceptDrops(True) self.setAcceptDrops(True)
# 啟動時清理舊的臨時文件 # 啟動時清理舊的臨時文件
@ -335,6 +336,14 @@ class ImageUploadWidget(QWidget):
def paste_from_clipboard(self) -> None: def paste_from_clipboard(self) -> None:
"""從剪貼板粘貼圖片""" """從剪貼板粘貼圖片"""
# 防重複保護:檢查是否在短時間內重複調用
current_time = time.time() * 1000 # 轉換為毫秒
if current_time - self._last_paste_time < 100: # 100毫秒內的重複調用忽略
debug_log(f"忽略重複的剪貼板粘貼請求(間隔: {current_time - self._last_paste_time:.1f}ms")
return
self._last_paste_time = current_time
clipboard = QApplication.clipboard() clipboard = QApplication.clipboard()
mimeData = clipboard.mimeData() mimeData = clipboard.mimeData()

View File

@ -434,10 +434,7 @@ class FeedbackWindow(QMainWindow):
debug_log(f"佈局變更失敗: {e}") debug_log(f"佈局變更失敗: {e}")
QMessageBox.warning(self, t('errors.title'), t('errors.interfaceReloadError', error=str(e))) QMessageBox.warning(self, t('errors.title'), t('errors.interfaceReloadError', error=str(e)))
def _handle_image_paste_from_textarea(self) -> None:
"""處理從文字框智能貼上圖片的功能"""
if self.tab_manager.feedback_tab:
self.tab_manager.feedback_tab.handle_image_paste_from_textarea()
def _on_reset_settings_requested(self) -> None: def _on_reset_settings_requested(self) -> None:
"""處理重置設定請求""" """處理重置設定請求"""

View File

@ -330,10 +330,7 @@ class TabManager:
if hasattr(parent, '_on_timeout_settings_changed'): if hasattr(parent, '_on_timeout_settings_changed'):
self.settings_tab.timeout_settings_changed.connect(parent._on_timeout_settings_changed) self.settings_tab.timeout_settings_changed.connect(parent._on_timeout_settings_changed)
# 連接回饋分頁的圖片貼上信號 # 圖片貼上信號已在 FeedbackTab 內部直接處理,不需要外部連接
if self.feedback_tab:
if hasattr(parent, '_handle_image_paste_from_textarea'):
self.feedback_tab.image_paste_requested.connect(parent._handle_image_paste_from_textarea)
def cleanup(self) -> None: def cleanup(self) -> None:
"""清理資源""" """清理資源"""