import sys from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit, QLabel, QWidget, QPushButton, QMessageBox, QComboBox, QDialogButtonBox, QShortcut from PyQt5 import uic from PyQt5.QtGui import QKeySequence from PyQt5.QtCore import Qt, QEvent, QObject, QTimer sys_path = sys.path[0].replace("\\", "/") ui_file_path = sys_path + "/DialogModifyText.ui" def modify_string(string, index, new_char): string_list = list(string) string_list[index] = new_char modified_string = ''.join(string_list) return modified_string def chr_adjust(old_chr, dif : int) : new_chr = old_chr if old_chr == '+': new_chr = '-' elif old_chr == '-': new_chr = '+' elif dif > 0: new_chr = chr(ord(old_chr) + 1) if new_chr > '9' : new_chr = '0' else : new_chr = chr(ord(old_chr) - 1) if new_chr < '0' : new_chr = '9' return new_chr class DialogModifyText(QDialog): def __init__(self, main_window, parent=None): super(DialogModifyText, self).__init__(parent) # Load UI file uic.loadUi(ui_file_path, self) self.Text = "2019-09-10 10:22:23" self.select_bit = 0 self.main_window = main_window self.setWindowTitle("参数修改") self.setWindowFlag(Qt.FramelessWindowHint) self.buttonBox.button(QDialogButtonBox.Ok).setText('确定') self.buttonBox.button(QDialogButtonBox.Cancel).setText('取消') self.buttonBox.clicked.connect(self.dialog_button_ok_clicked) modify_text = self.Text self.update_modify_info(modify_text, "缺省多字符修改") #让定时器周期刷修改字符串, 防止出现焦点切换时选中消失的情况 self.timer = QTimer(self) self.timer.timeout.connect(self.timeout_modify_string_refresh) self.timer.start(100) #定义4个快捷键, Key_Enter, Key_Escape经常被各类程序模块使用, 用Key_End, 与Key_Home来代替 QShortcut(QKeySequence(Qt.Key_Up), self, activated=self.key_increase_parameter) QShortcut(QKeySequence(Qt.Key_Down), self, activated=self.key_decrease_parameter) QShortcut(QKeySequence(Qt.Key_PageDown), self, activated=self.key_enter_process) QShortcut(QKeySequence(Qt.Key_PageUp), self, activated=self.key_escape_process) QShortcut(QKeySequence(Qt.Key_End), self, activated=self.key_enter_process) QShortcut(QKeySequence(Qt.Key_Home), self, activated=self.key_escape_process) @property def value(self): return self.Text def timeout_modify_string_refresh(self) : line_modify : QLineEdit = self.lineEdit modify_str : str = line_modify.text() self.update_modify_string(modify_str) def update_modify_info(self, modify_str, caption : str) : if hasattr(self, "label") : label : QLabel = self.label label.setText(caption) self.update_modify_string(modify_str) def update_modify_string(self, modify_str : str) : line_modify : QLineEdit = self.lineEdit line_modify.setText(modify_str) if self.select_bit < len(modify_str) : if modify_str[self.select_bit] == ' ': self.key_enter_process() # 设置选择从第self.select_bit个字符开始,长度为1 line_modify.setSelection(self.select_bit, 1) def key_increase_parameter(self): line_modify : QLineEdit = self.lineEdit text : str = line_modify.text() if self.select_bit < len(text) : old_chr = text[self.select_bit] new_chr = chr_adjust(old_chr, 1) new_modify_text = modify_string(text, self.select_bit, new_chr) self.update_modify_string(new_modify_text) def key_decrease_parameter(self): line_modify : QLineEdit = self.lineEdit text : str = line_modify.text() if self.select_bit < len(text) : old_chr = text[self.select_bit] new_chr = chr_adjust(old_chr, -1) new_modify_text = modify_string(text, self.select_bit, new_chr) self.update_modify_string(new_modify_text) def key_enter_process(self): line_modify : QLineEdit = self.lineEdit text : str = line_modify.text() if self.select_bit < len(text) - 1: self.select_bit += 1 if not str.isdigit(text[self.select_bit]) : self.key_enter_process() else : self.update_modify_string(text) else : self.buttonBox.button(QDialogButtonBox.Ok).click() def key_escape_process(self): self.buttonBox.button(QDialogButtonBox.Cancel).click() def dialog_button_ok_clicked(self, button): if button == self.buttonBox.button(QDialogButtonBox.Ok) : line_modify : QLineEdit = self.lineEdit self.Text = line_modify.text() if __name__ == '__main__': app = QApplication(sys.argv) dialog = DialogModifyText(None) dialog.show() dialog.exec_() sys.exit(0)