2017-12-24 42 views
1

Qt Designer (PyQt5 포함)로 설계된 양식이 있습니다. 필자는 입력을 위해 라인 편집을 사용합니다. 내가 원한 것은 라인 편집에서 키보드 콤보 (Ctrl + B 또는 기능 키 중 하나와 같은 것)를 사용하는 기능을 추가하는 것입니다. 해당 콤보 또는 기능 키를 누르면 클립 보드 내용을 "특수"방식으로 붙여 넣을 함수/메서드를 실행합니다 (클립 보드에서 값을 필터링하고 값을 조정한다는 의미입니다).키보드 단축키를 Qt 디자이너에서 QLineEdit에 할당하십시오.

모든 것이 쉬운 것처럼 보이고 많은 사람들이 이런 종류의 작업을 수행 했음에 틀림 없습니다. 그러나 나는 내가 원하는 것을하는 단순하고 이해할 수있는 단일 방법을 찾을 수 없었다. 여기 내가 찾는 해결책이 있습니다. 당신은 내가 갈거야 이해하는 나는 keyboard_key_pressed 부분 (및 기타)를 만들어

self.ui.my_lineedit.keyboard_key_pressed.connect(self.my_func, ctrl+b) 

def my_func(self): 
    pass 

: 다음은 MainForm 코드를 보유하고 수업을 받고있다. 위의 예처럼 내가 원하는 것을하기위한 간단한 방법이 있습니까?

+0

이 링크는 조금 도움이되는데 .. lineedit에 관한 것은 아니지만 주요 양식 자체에서 키 누르기 이벤트 만 수행하는 방법을 보여줍니다. 또한 그것은 콤보 등에 관한 정보를 제공하지 않습니다. https://stackoverflow.com/questions/45308101/how-pyqt5-keypressevent-works –

+0

이 링크는 콤보로 나를 도왔습니다 .. 남은 유일한 방법은이 모든 것을 수행하는 방법입니다 lineedit 포커스가 아니라 전체 메인 창. https://stackoverflow.com/questions/28204043/how-to-handle-keyboard-shortcuts-using-keypressevent-and-should-it-be-used-fo –

답변

1

가장 간단한 방법은 사용하는 것 QShortcut : 위젯이 키보드 포커스가있을 때

self.shortcut = QtWidgets.QShortcut(
    QtCore.QKeySequence('Ctrl+B'), self.ui.my_lineedit, self.my_func) 

이 만 활성화됩니다.

event-filter을 사용하여 동일한 결과를 얻을 수도 있습니다. 이것은 훨씬 더 큰 유연성을 제공하므로 모두 주어진 위젯의 events을 수신하고 원하는 경우 기본 동작 (있는 경우)을 수정할 수 있습니다. 이 접근법은 하위 클래스로는 작업 할 수 없거나 하위 클래스에서는 사용할 수없는 작업을 할 때 매우 유용 할 수 있습니다.

코드는 다음과 같을 것이다 :

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self): 
     ... 
     self.ui.my_lineedit.installEventFilter(self) 

    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.KeyPress and 
      source is self.ui.my_lineedit): 
      if (event.modifiers() & QtCore.Qt.ControlModifier and 
       event.key() == QtCore.Qt.Key_B):    
       self.my_func() 
       # return True here to stop further processing 
     return super(MainWindow, self).eventFilter(source, event) 

여기이 행사는 (다른 것들 사이에) 특정 modifierskey을 누르면 것에 대해 정보를 제공하는 QKeyEvent입니다.

+0

대단히 감사합니다. 필자는 포기하고 def keyPressEvent (self, e)를했다. function way (내가 제공 한 두 링크에서). 유일한 단점은 lineedit에 포커스를 확인하지 않는다는 것이지만 괜찮다고 결론 내렸다. 코드를 재 배열하면 필자가 제공 한 솔루션을 확실히 사용할 수 있습니다. 다시 한번 감사드립니다. –