diff --git a/src/input_handler/input_processor.py b/src/input_handler/input_processor.py index 542bc0d..673a5fb 100644 --- a/src/input_handler/input_processor.py +++ b/src/input_handler/input_processor.py @@ -28,7 +28,25 @@ class InputProcessor(QObject): return False # 2. 根据按键类型处理(字符、功能键等) - # 3. 更新输入缓冲区 + # 处理退格键 + if key == '\b' or key == '\x7f': # 退格键 (\b) 或删除键 (\x7f) + if self.input_buffer: # 只有当输入缓冲区有内容时才处理 + # 删除最后一个字符 + deleted_char = self.input_buffer[-1] + self.input_buffer = self.input_buffer[:-1] + self.current_position = max(0, self.current_position - 1) + + # 发送退格信号,包含被删除的字符 + self.text_changed.emit('\b') + + # 发送按键信号用于记录 + self.key_pressed.emit(f"backspace_deleted:{deleted_char}") + + return True + else: + return False # 缓冲区为空,不处理退格 + + # 3. 更新输入缓冲区(普通字符) self.input_buffer += key self.current_position += 1 diff --git a/src/ui/word_style_ui.py b/src/ui/word_style_ui.py index 98c29f3..0716239 100644 --- a/src/ui/word_style_ui.py +++ b/src/ui/word_style_ui.py @@ -465,6 +465,42 @@ class WordTextEdit(QTextEdit): def __init__(self, parent=None): super().__init__(parent) self.setup_ui() + self.input_processor = None # 输入处理器引用 + + def set_input_processor(self, processor): + """设置输入处理器""" + self.input_processor = processor + + def keyPressEvent(self, event): + """重写按键事件处理""" + # 处理退格键 + if event.key() == Qt.Key_Backspace: + if self.input_processor: + # 使用输入处理器处理退格键 + self.input_processor.process_key_event('\b') + # 让父类处理实际的文本编辑逻辑 + super().keyPressEvent(event) + else: + # 如果没有输入处理器,使用默认行为 + super().keyPressEvent(event) + # 处理删除键 + elif event.key() == Qt.Key_Delete: + if self.input_processor: + # 使用输入处理器处理删除键 + self.input_processor.process_key_event('\x7f') + # 让父类处理实际的文本编辑逻辑 + super().keyPressEvent(event) + else: + # 如果没有输入处理器,使用默认行为 + super().keyPressEvent(event) + else: + # 处理其他按键 + if self.input_processor and len(event.text()) > 0: + # 处理普通字符输入 + self.input_processor.process_key_event(event.text()) + + # 让父类处理实际的文本编辑逻辑 + super().keyPressEvent(event) def setup_ui(self): """设置文本编辑区域样式""" diff --git a/src/word_main_window.py b/src/word_main_window.py index aa4e950..dbf3ffc 100644 --- a/src/word_main_window.py +++ b/src/word_main_window.py @@ -15,6 +15,7 @@ from services.network_service import NetworkService from typing_logic import TypingLogic from ui.word_style_ui import WeatherAPI from file_parser import FileParser +from input_handler.input_processor import InputProcessor class WeatherFetchThread(QThread): weather_fetched = pyqtSignal(dict) @@ -86,6 +87,9 @@ class WordStyleMainWindow(QMainWindow): # 临时文件管理 self.temp_files = [] # 跟踪创建的临时文件 + # 初始化输入处理器 + self.input_processor = InputProcessor() + # 初始化网络服务和WeatherAPI self.network_service = NetworkService() self.weather_api = WeatherAPI() @@ -455,6 +459,13 @@ class WordStyleMainWindow(QMainWindow): # 设置默认文档内容 self.text_edit.setPlainText("在此输入您的内容...") + # 连接输入处理器到文本编辑器 + self.text_edit.set_input_processor(self.input_processor) + + # 连接输入处理器的信号 + self.input_processor.text_changed.connect(self.on_input_text_changed) + self.input_processor.key_pressed.connect(self.on_key_pressed) + document_layout.addWidget(self.text_edit) # 创建图片显示区域 @@ -563,6 +574,29 @@ class WordStyleMainWindow(QMainWindow): self.is_modified = True self.update_window_title() + def on_input_text_changed(self, text): + """输入处理器文本变化处理""" + if self.view_mode == "learning" and self.imported_content: + # 在学习模式下,根据输入处理器的状态更新显示 + current_text = self.text_edit.toPlainText() + expected_text = self.imported_content[:len(text)] + + # 如果文本不匹配,更新显示 + if current_text != expected_text: + cursor = self.text_edit.textCursor() + self.text_edit.setPlainText(expected_text) + # 保持光标在末尾 + cursor.movePosition(QTextCursor.End) + self.text_edit.setTextCursor(cursor) + + def on_key_pressed(self, key): + """按键按下处理""" + # 更新状态栏显示当前按键 + if key in ['\b', '\x7f']: + self.status_bar.showMessage("退格键已处理", 1000) + else: + self.status_bar.showMessage(f"按键: {key}", 1000) + def handle_learning_mode_typing(self): """学习模式下的打字处理 - 从上次中断处继续显示学习文档C内容到文档A""" if self.imported_content and self.typing_logic: @@ -574,8 +608,9 @@ class WordStyleMainWindow(QMainWindow): # 只有在光标位于文本末尾时才显示新内容 if cursor_position == len(current_text): - # 计算应该显示的字符数(基于当前已显示的字符数) - chars_to_show = min(self.displayed_chars + 1, len(self.imported_content)) + # 使用输入处理器的状态来显示文本 + input_text = self.input_processor.input_buffer + chars_to_show = len(input_text) # 更新已显示字符数 self.displayed_chars = chars_to_show @@ -588,7 +623,7 @@ class WordStyleMainWindow(QMainWindow): self.typing_logic.typed_chars = self.displayed_chars self.typing_logic.current_index = self.displayed_chars - # 获取应该显示的文本部分(从上次中断处继续) + # 获取应该显示的文本部分(基于输入处理器的状态) display_text = self.imported_content[:self.displayed_chars] # 临时禁用文本变化信号,避免递归