Python: как управлять вводом и выводом Lineedit в PyQt

Приведенный ниже код создает простое диалоговое окно с одним только виджетом: QLineEdit. Ввод чего-либо в это поле вызывает метод fixText() (для textChanged), который очищает входящий строковый аргумент. После того, как строка была «очищена», метод обновляет QLineEdit с результатом.

Цель: независимо от того, что пользователь вводит в поле редактирования строки:

Первые четыре буквы всегда заглавные. Пятый символ всегда подчеркивание.

Оставшиеся символы в строке не нужно очищать, кроме того, что делает cleanupString().

Пример того, что необходимо сделать: ABCD_helloWorld

Возникла проблема: невозможно вставить символ подчеркивания без ошибок. Строки кода, отвечающие за вставку подчеркивания, в настоящее время закомментированы...

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_())

ФИКСИРОВАННЫЙ КОД:

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_())

person alphanumeric    schedule 19.03.2014    source источник


Ответы (1)


вы можете сделать что-то вроде:

    if len(arg)<=3: result=arg.upper()
    else: result = arg[0:4].upper()+"_"+arg[5:]

Хотя вы не сможете использовать клавишу Backspace для удаления… вам нужно будет выделить текст, чтобы удалить его.

person fredtantini    schedule 20.03.2014
comment
Здорово! Спасибо! Простой! - person alphanumeric; 20.03.2014