Python:如何在PyQt中控制Lineedit的输入和输出

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:]

尽管如此,您将无法使用退格键来删除……您将不得不选择要删除的文本。