<think>我们只需要一个非常简洁的输入框,满足以下要求:
1. 通过某个事件(比如按钮点击)调出输入框
2. 输入框支持多行输入,使用Ctrl+Enter提交
3. 提交后返回输入内容,并关闭输入框
4. 不需要动画效果,不需要复杂的样式
由于主窗口已有,我们只需要创建一个简单的输入框类,并在主窗口中调用即可。
我们将创建一个`SimpleInputDialog`类,它继承自`QDialog`。这样我们可以利用对话框的模态特性。
功能点:
- 使用`QTextEdit`作为输入框,支持多行。
- 重写`keyPressEvent`方法,捕获`Ctrl+Enter`组合键进行提交。
- 提供`getText`静态方法方便调用(可选,也可以直接创建实例)。
注意:这里我们不需要取消按钮,只需要提交功能。但为了用户友好,我们也可以允许ESC关闭(不提交)。
设计:
标题:可自定义
输入框:多行
按钮:一个提交按钮(也可以不用,完全用快捷键)
为了极简,我们可以不要按钮,完全通过快捷键操作。但为了用户明确如何提交,我们可以在输入框下方添加一个提示标签,例如“按Ctrl+Enter提交”。
但是根据要求,我们只要三个功能:调出、输入、提交反馈。所以我们可以不要按钮,也不要提示标签,完全通过快捷键。
然而,为了确保用户知道如何提交,我们可以在窗口标题或输入框的placeholderText中提示。
我们这样设计:
- 窗口标题:例如“输入”
- placeholderText: "输入内容,按Ctrl+Enter提交"
代码结构:
class SimpleInputDialog(QDialog):
def __init__(self, parent=None, title="输入", placeholder="输入内容,按Ctrl+Enter提交"):
super().__init__(parent)
# 设置窗口标题
# 创建布局:一个输入框
# 设置输入框的占位文本
# 设置输入框为焦点
def keyPressEvent(self, event):
# 如果按下Ctrl+Enter,则接受并关闭
# 如果按下Esc,则拒绝并关闭
@staticmethod
def getText(parent=None, title="输入", placeholder="输入内容,按Ctrl+Enter提交"):
dialog = SimpleInputDialog(parent, title, placeholder)
result = dialog.exec_()
if result == QDialog.Accepted:
return dialog.text_edit.toPlainText().strip()
else:
return None
在主窗口中调用:
当需要调出输入框时,调用SimpleInputDialog.getText(),然后处理返回的字符串。
注意:使用静态方法getText是为了模仿QInputDialog的行为,方便使用。
但是,我们也可以不使用静态方法,而是直接创建对话框并连接信号。不过,为了简单,我们使用exec_()模态对话框直接返回结果。
下面给出代码:</think># 极简输入框模块实现
以下是一个高度简化的输入框模块,只包含三个核心功能:
1. 调出输入框
2. 输入内容
3. 使用 Ctrl+Enter 提交并返回结果
```python
import sys
from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QTextEdit
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QKeyEvent
class MinimalInputDialog(QDialog):
"""极简输入框,仅支持调出、输入和Ctrl+Enter提交"""
submitted = pyqtSignal(str) # 提交信号
def __init__(self, parent=None):
super().__init__(parent, Qt.Window | Qt.WindowStaysOnTopHint)
self.setWindowTitle("输入")
self.setMinimumSize(300, 150)
# 主布局
layout = QVBoxLayout(self)
layout.setContentsMargins(10, 10, 10, 10)
# 输入框
self.text_edit = QTextEdit()
self.text_edit.setPlaceholderText("输入内容... (Ctrl+Enter 提交)")
layout.addWidget(self.text_edit)
def keyPressEvent(self, event: QKeyEvent):
"""处理按键事件"""
if event.key() == Qt.Key_Return and event.modifiers() & Qt.ControlModifier:
# Ctrl+Enter 提交
text = self.text_edit.toPlainText().strip()
if text:
self.submitted.emit(text)
self.accept()
return
super().keyPressEvent(event)
def show_dialog(self):
"""显示对话框并设置焦点"""
self.text_edit.clear()
self.text_edit.setFocus()
self.exec_()
# 示例使用
if __name__ == '__main__':
app = QApplication(sys.argv)
# 主窗口类示例
class MainWindow:
def __init__(self):
self.input_dialog = MinimalInputDialog()
self.input_dialog.submitted.connect(self.handle_input)
def show_input_dialog(self):
"""调出输入框"""
self.input_dialog.show_dialog()
def handle_input(self, text):
"""处理输入结果"""
print(f"收到输入: {text}")
# 这里可以添加与特定个体交流的逻辑
# 使用示例
main = MainWindow()
main.show_input_dialog()
sys.exit(app.exec_())
```
## 代码详细解释
### 1. MinimalInputDialog 类
#### 核心特性
1. **极简设计**:
- 只有一个文本输入框
- 无按钮、无标题栏装饰
- 最小化尺寸(300x150)
2. **提交信号**:
```python
submitted = pyqtSignal(str)
```
当用户提交内容时发出信号,携带输入文本
3. **按键处理**:
```python
def keyPressEvent(self, event: QKeyEvent):
if event.key() == Qt.Key_Return and event.modifiers() & Qt.ControlModifier:
text = self.text_edit.toPlainText().strip()
if text:
self.submitted.emit(text)
self.accept()
```
- 仅响应 Ctrl+Enter 组合键
- 自动去除首尾空白
- 非空内容才触发提交
4. **显示方法**:
```python
def show_dialog(self):
self.text_edit.clear()
self.text_edit.setFocus()
self.exec_()
```
- 每次显示前清空内容
- 自动聚焦到输入框
- 使用模态对话框阻塞其他操作
### 2. 使用示例 (MainWindow)
```python
class MainWindow:
def __init__(self):
# 创建输入框实例
self.input_dialog = MinimalInputDialog()
# 连接提交信号
self.input_dialog.submitted.connect(self.handle_input)
def show_input_dialog(self):
"""调出输入框"""
self.input_dialog.show_dialog()
def handle_input(self, text):
"""处理输入结果"""
print(f"收到输入: {text}")
# 这里可以添加与特定个体交流的逻辑
```
### 3. 完整集成示例
以下是一个更完整的集成示例,展示如何在实际应用中使用:
```python
import sys
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QWidget, QVBoxLayout,
QPushButton, QLabel, QTextBrowser
)
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QKeyEvent
class MinimalInputDialog(QDialog):
"""极简输入框"""
submitted = pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent, Qt.Window | Qt.WindowStaysOnTopHint)
self.setWindowTitle("输入")
self.setMinimumSize(300, 150)
layout = QVBoxLayout(self)
layout.setContentsMargins(10, 10, 10, 10)
self.text_edit = QTextEdit()
self.text_edit.setPlaceholderText("输入内容... (Ctrl+Enter 提交)")
layout.addWidget(self.text_edit)
def keyPressEvent(self, event: QKeyEvent):
if event.key() == Qt.Key_Return and event.modifiers() & Qt.ControlModifier:
text = self.text_edit.toPlainText().strip()
if text:
self.submitted.emit(text)
self.accept()
return
super().keyPressEvent(event)
def show_dialog(self):
self.text_edit.clear()
self.text_edit.setFocus()
self.exec_()
class CommunicationApp(QMainWindow):
"""交流应用主窗口"""
def __init__(self):
super().__init__()
self.setWindowTitle("极简交流工具")
self.setGeometry(100, 100, 500, 400)
# 创建输入框实例
self.input_dialog = MinimalInputDialog(self)
self.input_dialog.submitted.connect(self.handle_input)
# 创建UI
self.init_ui()
def init_ui(self):
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
layout.setContentsMargins(20, 20, 20, 20)
layout.setSpacing(15)
# 标题
title = QLabel("极简交流工具")
title.setAlignment(Qt.AlignCenter)
title.setStyleSheet("font-size: 18px; font-weight: bold;")
layout.addWidget(title)
# 打开输入框按钮
self.open_btn = QPushButton("开始输入")
self.open_btn.clicked.connect(self.input_dialog.show_dialog)
self.open_btn.setStyleSheet("""
QPushButton {
background-color: #4CAF50;
color: white;
padding: 10px;
font-size: 14px;
border-radius: 5px;
}
QPushButton:hover {
background-color: #45a049;
}
""")
layout.addWidget(self.open_btn)
# 消息显示区域
self.message_display = QTextBrowser()
self.message_display.setPlaceholderText("消息将显示在这里...")
self.message_display.setStyleSheet("""
QTextBrowser {
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
background-color: #f9f9f9;
}
""")
layout.addWidget(self.message_display, 1)
# 状态标签
self.status_label = QLabel("就绪")
self.status_label.setAlignment(Qt.AlignCenter)
self.status_label.setStyleSheet("color: #666; font-size: 12px;")
layout.addWidget(self.status_label)
def handle_input(self, text):
"""处理输入内容"""
# 显示消息
self.message_display.append(f"<b>你:</b> {text}")
self.status_label.setText("消息已发送")
# 这里可以添加与特定个体交流的逻辑
# 例如:发送到API、保存到数据库等
# self.send_to_recipient(text)
# 模拟回复
self.message_display.append(f"<b>对方:</b> 已收到你的消息: '{text}'")
self.status_label.setText("收到回复")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = CommunicationApp()
window.show()
sys.exit(app.exec_())
```
## 功能特点
1. **极简设计**:
- 仅包含必需的输入框组件
- 无多余装饰或控件
- 最小化视觉干扰
2. **核心功能实现**:
- **调出输入框**:通过 `show_dialog()` 方法
- **输入内容**:在文本编辑框中输入
- **Ctrl+Enter提交**:唯一提交方式
3. **高效集成**:
- 通过 `submitted` 信号传递输入内容
- 轻量级实现(仅约30行代码)
- 易于嵌入现有应用
4. **用户体验优化**:
- 自动聚焦到输入框
- 提交后自动关闭
- 清除上次输入内容
## 使用场景
这个极简输入框非常适合以下场景:
1. **聊天机器人接口**:快速输入问题并获取回答
2. **命令执行工具**:输入命令并获取执行结果
3. **数据录入系统**:快速输入简短信息
4. **笔记应用**:临时记录想法
5. **反馈收集**:用户快速提交反馈
## 进阶扩展
### 1. 添加自动完成功能
```python
class AutoCompleteInputDialog(MinimalInputDialog):
def __init__(self, suggestions, parent=None):
super().__init__(parent)
from PyQt5.QtWidgets import QCompleter
# 创建自动完成器
completer = QCompleter(suggestions)
completer.setCaseSensitivity(Qt.CaseInsensitive)
self.text_edit.setCompleter(completer)
```
### 2. 添加历史记录功能
```python
class HistoryInputDialog(MinimalInputDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.history = []
self.history_index = -1
def keyPressEvent(self, event: QKeyEvent):
# 上箭头浏览历史
if event.key() == Qt.Key_Up and not event.modifiers():
if self.history:
self.history_index = min(self.history_index + 1, len(self.history) - 1)
self.text_edit.setPlainText(self.history[self.history_index])
return
# 下箭头浏览历史
if event.key() == Qt.Key_Down and not event.modifiers():
if self.history and self.history_index > 0:
self.history_index -= 1
self.text_edit.setPlainText(self.history[self.history_index])
return
super().keyPressEvent(event)
def handle_input(self, text):
# 保存到历史记录
if text and (not self.history or text != self.history[-1]):
self.history.append(text)
self.history_index = -1
super().handle_input(text)
```
### 3. 添加多语言支持
```python
class I18nInputDialog(MinimalInputDialog):
def __init__(self, language="en", parent=None):
super().__init__(parent)
self.set_language(language)
def set_language(self, lang):
translations = {
"en": {"title": "Input", "placeholder": "Type here... (Ctrl+Enter to submit)"},
"zh": {"title": "输入", "placeholder": "输入内容... (Ctrl+Enter 提交)"},
"es": {"title": "Entrada", "placeholder": "Escriba aquí... (Ctrl+Enter para enviar)"},
"fr": {"title": "Saisie", "placeholder": "Tapez ici... (Ctrl+Entrée pour envoyer)"},
"ja": {"title": "入力", "placeholder": "入力してください... (Ctrl+Enterで送信)"},
}
lang_data = translations.get(lang, translations["en"])
self.setWindowTitle(lang_data["title"])
self.text_edit.setPlaceholderText(lang_data["placeholder"])
```
## 最佳实践建议
1. **错误处理**:
- 添加空输入检查
- 处理特殊字符
- 防止多次提交
2. **性能优化**:
- 避免不必要的重绘
- 使用轻量级组件
- 及时释放资源
3. **可访问性**:
- 添加键盘导航支持
- 提供屏幕阅读器兼容
- 支持高对比度模式
4. **安全性**:
- 验证输入内容
- 防止注入攻击
- 加密敏感数据
这个极简输入框模块完全满足您的三个核心需求,代码简洁高效,易于集成到现有应用中。