Python: How to control Lineedit input and output in PyQt
下面发布的代码创建了一个仅包含小部件QLineEdit的简单对话框窗口。
在此字段中键入任何内容都会触发fixText()方法(在textChanged上),该方法将清理传入的字符串参数。在"清理"字符串之后,该方法将使用结果更新QLineEdit。
目标:不管有哪些用户在lineedit字段中输入:
前四个字母始终为大写。
第五个字符始终是下划线。
字符串中剩余的字符不必清除cleanupString()之外的内容。
需要实现的示例:ABCD_helloWorld
遇到的问题:无法插入下划线字符而不弄乱其他内容。
当前注释下划线插入的代码行...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import sys, os from PyQt4 import QtCore, QtGui class Dialog_01(QtGui.QMainWindow): def __init__(self): super(QtGui.QMainWindow,self).__init__() myQWidget = QtGui.QWidget() myBoxLayout = QtGui.QVBoxLayout() self.myQLineEdit = QtGui.QLineEdit("Type text here") self.myQLineEdit.textChanged.connect(self.fixText) myBoxLayout.addWidget(self.myQLineEdit) myQWidget.setLayout(myBoxLayout) self.setCentralWidget(myQWidget) self.setWindowTitle('Dialog 01') def fixText(self, arg): arg=str(arg) if not arg: return arg=self.cleanupString(arg) if len(arg)<3: result=arg.upper() else: result = arg[0:4].upper()+arg[4:] # resultList=list(result) # resultList.insert(4, '_') # result=''.join(resultList) self.myQLineEdit.blockSignals(True) self.myQLineEdit.setText(result) self.myQLineEdit.blockSignals(False) def cleanupString(self, line=None): if line==None: return invalid = invalid = ['!','"','#','$','%','&','\\\','(',')','*','+',',','-','.','/' ,':',';','<','=','>','?','@','[',"'",']','^','`','{','|','}','~', ' '] for c in invalid: if len(line)>0: line=line.replace(c,'_') return line if __name__ == '__main__': app = QtGui.QApplication(sys.argv) dialog_1 = Dialog_01() dialog_1.show() dialog_1.resize(480,320) sys.exit(app.exec_()) |
固定代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import sys, os from PyQt4 import QtCore, QtGui class Dialog_01(QtGui.QMainWindow): def __init__(self): super(QtGui.QMainWindow,self).__init__() myQWidget = QtGui.QWidget() myBoxLayout = QtGui.QVBoxLayout() self.myQLineEdit = QtGui.QLineEdit("Type text here") self.myQLineEdit.textChanged.connect(self.fixText) myBoxLayout.addWidget(self.myQLineEdit) myQWidget.setLayout(myBoxLayout) self.setCentralWidget(myQWidget) self.setWindowTitle('Dialog 01') def fixText(self, arg): arg=str(arg) if not arg: return arg=self.cleanupString(arg) if len(arg)<=3: result=arg.upper() else: result = arg[0:4].upper()+"_"+arg[5:] self.myQLineEdit.blockSignals(True) self.myQLineEdit.setText(result) self.myQLineEdit.blockSignals(False) def cleanupString(self, line=None): if line==None: return invalid = invalid = ['!','"','#','$','%','&','\\\','(',')','*','+',',','-','.','/' ,':',';','<','=','>','?','@','[',"'",']','^','`','{','|','}','~', ' '] for c in invalid: if len(line)>0: line=line.replace(c,'_') return line if __name__ == '__main__': app = QtGui.QApplication(sys.argv) dialog_1 = Dialog_01() dialog_1.show() dialog_1.resize(480,320) sys.exit(app.exec_()) |
您可以执行以下操作:
1 2 | if len(arg)<=3: result=arg.upper() else: result = arg[0:4].upper()+"_"+arg[5:] |
尽管如此,您将无法使用退格键来删除……您将不得不选择要删除的文本。