2016-11-07 6 views
2

Qt Designer에서 만든 양식에서 QPlainTextWidget에 입력 한 키 입력을 읽어야합니다.Python : Qt Designer에서 만든 QPlainTextWidget에서 키 입력 받기

전체 결과 텍스트를 QPlainTextWidget.toPlainText()으로 읽을 수 있음을 알고 있지만 글자가 입력됨에 따라 글자를 개별적으로 읽어야합니다. (사진 작가를위한 파일 이름 바꾸기 프로그램을 작성 중이며 텍스트 상자에 입력 한 결과 새 파일 이름을 사용자에게 표시하고 싶습니다. 해당 항목을 파일 이름의 기본 이름으로 사용합니다.)

self.txtFilename.keyPressDown.connect(self.DiplayNewFilename)으로 텍스트 상자에 서브 루틴을 연결하려고했지만 keyPressDown이 슬롯이 아니기 때문에 오류가 발생합니다.

나는 서브 클래 싱이 해결책을 만들 수 있다고 온라인에서 읽었지만 그 방법이나 서브 클래 싱 코드를 전체 코드에 넣을 위치를 모른다. 내 프로그램은 Qt Designer에서 만든 GUI 양식을 사용하는 단일 양식 응용 프로그램입니다. Qt 디자이너가 생성 한 GUI 코드를 편집하는 대신 주요 파이썬 파일에 코딩 솔루션을 추가 할 수있는 유연한 솔루션을 만들고 싶습니다.

현재 코드에는 하나의 클래스 (기본 창용) 만 있습니다. 새로운 서브 클래 싱 코드는 어디에 두어야합니까? -이 기존 클래스 안에 또는 새로운 클래스로? 어떻게 부를까요?

나는 아래의 코드에서 photoOrg_MainWindow.Ui_MainWindow은 Qt 디자이너가 만든 양식입니다. 우분투 16.04, 파이썬 3 및 Qt 4를 실행하고 있습니다. txtFilename은 캡처하려는 키 입력이있는 텍스트 위젯입니다.

환호, 그리고 대단히 감사합니다!

TL/DR : Qt Designer에서 만든 텍스트 위젯에서 텍스트 상자 키 스트로크에 액세스 할 수 있습니까?

여기에 지금까지 내 코드의 본질이다 :

class MainWindow(QtGui.QMainWindow, photoOrg_MainWindow.Ui_MainWindow): 

    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) 
     self.actionOpen_Files.triggered.connect(self.GetPhotoFileNames) 
     self.txtFilename.keyPressDown.connect(self.DisplayNewFilename) #this doesn't work 

    more irrelevant routines and connect bindings code here... 

    def DisplayNewFilename(self): 
     Code that processes the keystroke to display it as part of a sample new filename displayed in a QLabel 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainWindow() 
    form.show()      
    app.exec_()       

if __name__ == '__main__':    
    main() 

답변

2

난 당신이 너무 많은 문제에 대해 생각 :) .. eventFilter 당신에게 많은 도움 수 있다고 생각합니다. 여기에 비트를

class Example(QtGui.QWidget): 
    def __init__(self): 
     super(Example, self).__init__() 
     self.setGeometry(300, 300, 250, 150) 
     vLayout = QtGui.QVBoxLayout(self) 
     plainTextEdit = QtGui.QPlainTextEdit() 
     self.newName = QtGui.QLineEdit() 
     vLayout.addWidget(plainTextEdit) 
     vLayout.addWidget(self.newName) 
     plainTextEdit.installEventFilter(self) 
     self.show() 

    def eventFilter(self, sourceObj, event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      if event.text() == "z": 
       self.newName.setText("do you mean zoo ?") 
     return QtGui.QWidget.eventFilter(self, sourceObj, event) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

을 도울 수있는 작은 예입니다 그리고 keyPressDown는 이벤트 .. 더 힌트

+0

우수의 문서를 참조하십시오 신호하지 않습니다! 매력처럼 일했습니다! 눌려진 문자가 실제로 텍스트 상자에 추가되기 전에'KeyPress'가 발생하기 때문에'KeyPress' 이벤트 대신'KeyRelease' 이벤트를 사용하여 텍스트 상자의 텍스트를 캡처해야했습니다. 대단히 감사합니다! – trinkner

+0

도움이 된 것을 기쁘게 생각합니다. :) – Achayan