当用户点击录入按钮时,可以通过代码触发一个事件来关闭中文输入法并切换至英文输入法。下面是示例代码的修改部分:
from PySide6.QtWidgets import QApplication, QMainWindow, QPlainTextEdit, QPushButton, QInputDialog, QMessageBox
from PySide6.QtCore import Qt, QEvent
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.exclude_rows = []
self.text_edit = QPlainTextEdit(self)
self.text_edit.setPlainText("请在《汇总表》的工作表中输入行号(从1开始计数,以逗号隔开,例如:1,2,3):")
self.text_edit.setReadOnly(True)
self.text_edit.setGeometry(10, 10, 280, 150)
self.button = QPushButton("录入结束", self)
self.button.setGeometry(10, 170, 100, 30)
self.button.clicked.connect(self.show_input_dialog)
def eventFilter(self, obj, event):
if obj is self.text_edit and event.type() == QEvent.KeyPress:
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
# 按下回车键时关闭中文输入法并切换至英文输入法
QApplication.inputMethod().reset()
QApplication.inputMethod().setInputMethodHints(Qt.ImhLatinOnly)
return super().eventFilter(obj, event)
def show_input_dialog(self):
self.text_edit.installEventFilter(self) # 安装事件过滤器
rows_input, ok = QInputDialog.getText(self, "输入行号", "请输入行号(以逗号隔开):")
self.text_edit.removeEventFilter(self) # 移除事件过滤器
if ok:
rows = []
for row in rows_input.split(','):
try:
row_num = int(row) - 1 # 因为要从0开始计数,所以减去1
rows.append(row_num)
except ValueError:
QMessageBox.warning(self, "无效输入", "请确保输入的是整数,并用逗号分隔行号。")
return
total_rows = 10 # 假设总共有10行
valid_rows = [row for row in rows if 0 <= row < total_rows]
invalid_rows = [row for row in rows if row not in valid_rows]
if invalid_rows:
QMessageBox.warning(self, "无效行号", f"以下行号不在有效范围内:{invalid_rows}")
else:
self.exclude_rows = valid_rows
print('用户录入的内容是:', self.exclude_rows)
app = QApplication()
window = MyWindow()
window.show()
app.exec()
在代码中,我定义了一个`eventFilter`函数来拦截并处理文本编辑框的键盘事件。当用户按下回车键时,会调用`reset()`方法关闭中文输入法,并使用`setInputMethodHints()`方法切换至英文输入法。在按钮点击事件处理函数`show_input_dialog()`中,我通过`installEventFilter()`和`removeEventFilter()`方法来安装和移除事件过滤器,确保只有在录入过程中处理回车键事件。
请注意,对于不同的平台和输入法设置,可能需要进行进一步适配和测试。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |