2012-01-07 15 views
14

Buduję interfejs użytkownika z projektantem QT i chcę przycisków do wykonywania różnych działań z różnymi modyfikatorami. Pomyślałem więc, że mogę wywoływać funkcje z dynamicznymi właściwościami łańcuchów, które wykonałyby akcję w zależności od modyfikatora.Jak sprawdzić, czy naciśnięto klawisz modyfikujący (shift, ctrl, alt)?

Jeśli ktokolwiek zna prostszy sposób, to bardzo bym to docenił.

+2

Zobacz http://stackoverflow.com/questions/3100090/howto-detect-the-modifier-key-on-mouse-click- in-qt – Tanriol

+0

Czy masz na myśli, że chcesz używać 'MouseClick + Modifier' do uruchamiania poleceń? A co oznacza "dynamiczne właściwości łańcuchów"? – ekhumoro

+0

Witam, miałem na myśli, gdy ktoś shift kliknie przycisk w qt ui wykonuje inną akcję niż kliknięcie ctrl lub zwykłe kliknięcie. – user1087058

Odpowiedz

33

Wygląda na to wszystko, co musisz zrobić, to sprawdzić QApplication.keyboardModifiers w przycisk obsługi i wybierz inną czynność odpowiednio:

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.button = QtGui.QPushButton('Test', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     modifiers = QtGui.QApplication.keyboardModifiers() 
     if modifiers == QtCore.Qt.ShiftModifier: 
      print('Shift+Click') 
     elif modifiers == QtCore.Qt.ControlModifier: 
      print('Control+Click') 
     elif modifiers == (QtCore.Qt.ControlModifier | 
          QtCore.Qt.ShiftModifier): 
      print('Control+Shift+Click') 
     else: 
      print('Click') 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

(NB: various modifiers można OR'd razem w celu sprawdzenia dla kombinacji z wieloma klawiszami).

6

To jest późna odpowiedź, ale to jest rozwiązanie, które znalazłem.

że próbuje obsługiwać wiele naciśnięte jednocześnie (np i W lub W i D). Rozwiązanie poniżej prac z wielu klawiszy zostanie naciśnięty w tym samym czasie (w tym Ctrl, Przesunięcie, Alt, etc). Mam nadzieję, że ktoś inny uzna to za przydatne.

def keyPressEvent(self, event): 
    self.firstrelease = True 
    astr = "pressed: " + str(event.key()) 
    self.keylist.append(astr) 

def keyReleaseEvent(self, event): 
    if self.firstrelease == True: 
     self.processmultikeys(self.keylist) 

    self.firstrelease = False 
    del self.keylist[-1] 

def processmultikeys(self,keyspressed): 
    # your logic here 
    print keyspressed 

Przejdź tutaj oryginalnego omówienie tego rozwiązania: How to get multiple key presses in single event?

Powiązane problemy