Come verificare se un tasto modificatore viene premuto (shift, ctrl, alt)?

Sto costruendo un’interfaccia utente con QT designer e desidera pulsanti per eseguire diverse azioni con diversi modificatori. Così ho pensato che avrei potuto chiamare funzioni con dinamica proprietà della stringa che esegue l’azione a seconda del modificatore.

Se qualcuno conosce un metodo più semplice per fare questo lo apprezzerei molto.

  • Vedere stackoverflow.com/questions/3100090/…
  • Vuoi dire che si desidera utilizzare MouseClick+Modifier per eseguire i comandi? E cosa significa “dinamico” proprietà stringa di dire?
  • Ciao, volevo dire quando qualcuno turno di fa clic su un pulsante in qt interfaccia utente esegue un’azione diversa rispetto ctrl + clic o solo un normale click.

 

3 Replies
  1. 38

    Sembra che tutto quello che dovete fare è controllare QApplication.keyboardModifiers in il gestore del pulsante e selezionare un’azione differente, come appropriato:

    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: il vari modificatori può essere O avevo insieme, in modo da controllare multi-combinazioni di tasti).

  2. 6

    Questa è la risposta in ritardo, ma questa è la soluzione che ho trovato.

    Stavo cercando di gestire più tasti premuti allo stesso tempo (ad esempio, Un e W o W e D). La soluzione di sotto di opere con più tasti vengano premuti contemporaneamente (tra cui Ctrl, Maiusc, Alt, ecc). Spero che qualcun altro possa risultare utile.

    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

    Vai qui per la discussione originale di questa soluzione: Come ottenere più di un tasto in un singolo evento?

  3. 0

    ecco un altro approccio che utilizza gli operatori bit, che consente di ottenere in molti combo.

    @classmethod
    def get_key_modifiers(cls):
        QModifiers = Qt.QtWidgets.QApplication.keyboardModifiers()
        modifiers = []
        if (QModifiers & Qt.QtCore.Qt.ShiftModifier) == Qt.QtCore.Qt.ShiftModifier:
            modifiers.append('shift')
        if (QModifiers & Qt.QtCore.Qt.ControlModifier) == Qt.QtCore.Qt.ControlModifier:
            modifiers.append('control')
        if (QModifiers & Qt.QtCore.Qt.AltModifier) == Qt.QtCore.Qt.AltModifier:
            modifiers.append('alt')
        return modifiers

Lascia un commento