2017-12-24 11 views
1

Ich habe ein Formular in Qt Designer (mit PyQt5) entworfen. Ich benutze dort ein Line-Edit um einige Eingaben einzugeben. Was ich möchte, ist die Möglichkeit, eine Tastaturkombination (etwas wie Strg + B oder eine der Funktionstasten) in der Zeilenbearbeitung zu verwenden. Sobald diese Combo oder Funktionstaste gedrückt wird, werde ich eine Funktion/Methode ausführen, die den Inhalt der Zwischenablage auf eine "spezielle" Art und Weise einfügen wird (was bedeutet, dass der Wert aus der Zwischenablage gefiltert und angepasst wird).Zuweisen einer Tastenkombination zu QLineEdit von Qt Designer

Es scheint alles einfach, und viele Leute müssen diese Art von Sachen schon einmal gemacht haben. Aber ich war nicht in der Lage, eine einzige, einfache und verständliche Art zu finden, was ich will. Hier ist die Art von Lösung, die ich suche. Im Folgenden ist unter einer Klasse, die die Mainform Code enthält:

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

def my_func(self): 
    pass 

ich die keyboard_key_pressed Teil (und andere) aus für Sie zu verstehen, was ich werde. Gibt es eine einfache Möglichkeit, das zu tun, was ich möchte, wie im obigen Beispiel?

+0

Ich fand diesen Link, der ein bisschen hilft .. aber es ist nicht in Bezug auf Lineedit, es zeigt nur, wie man eine Taste drücken Ereignis auf dem Hauptformular selbst. Auch gibt es keine Informationen über Combos und solche: https://StackOverflow.com/Questions/45308101/how-pyqt5-Keyypressevent-works –

+0

Dieser Link half mir mit den Combos .. Nur noch übrig ist, wie man das alles macht der lineedit Fokus, und nicht das ganze Hauptfenster. https://stackoverflow.com/questions/28204043/how-to-handle-keyboard-shortcuts-using-keypressevent-and-should-it-be-used-fo –

Antwort

1

Der einfachste Ansatz wäre ein QShortcut zu verwenden:

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

Dies wird nur dann aktiviert werden, wenn das Widget den Tastaturfokus hat.

Sie können auch eine event-filter verwenden, um das gleiche zu erreichen. Dies bietet eine viel größere Flexibilität, so dass Sie auf alle die events eines bestimmten Widgets hören können und das Standardverhalten (falls vorhanden) in beliebiger Weise ändern können. Dieser Ansatz kann sehr nützlich sein, wenn Sie mit Widgets arbeiten, die Sie nicht (oder lieber nicht) als Unterklassen verwenden möchten.

Der Code würde wie folgt aussehen:

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) 

Die Veranstaltung hier ist ein QKeyEvent, die (unter anderem) Informationen über die spezifischen modifiers und key gedrückt bietet.

+0

Vielen Dank. Ich gab auf und tat die def keyPressEvent (self, e): Funktion Weg (von den zwei Links, die ich zur Verfügung gestellt). Der einzige Nachteil ist, dass es nicht den Fokus auf lineedit überprüft, aber ich entschied, dass das in Ordnung war. Wenn ich meinen Code neu anlege, werde ich definitiv die von Ihnen bereitgestellte Lösung verwenden. Danke nochmal @Ekhumoro! –

Verwandte Themen