2012-01-07 5 views
14

Я создаю пользовательский интерфейс с дизайнером QT и хочу, чтобы кнопки выполняли разные действия с различными модификаторами. Поэтому я думал, что могу вызвать функции с динамическими свойствами строки, которые будут выполнять действие в зависимости от модификатора.Как проверить, нажат ли ключ-модификатор (shift, ctrl, alt)?

Если кто-нибудь знает более простой способ сделать это, я был бы очень признателен.

+2

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

+0

Вы хотите использовать 'MouseClick + Modifier' для запуска команд? И что означает «свойства динамических строк»? – ekhumoro

+0

Привет, я имел в виду, когда кто-то меняет клик на кнопку в qt ui, он выполняет другое действие, кроме клика или обычного клика. – user1087058

ответ

33

Похоже, все, что вам нужно сделать, это проверить QApplication.keyboardModifiers в обработчике кнопки и выберите другое действие в зависимости от обстоятельств:

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 могут быть соединены через, чтобы проверить для комбинаций с несколькими ключами).

6

Это конец ответа, но это решение, которое я нашел.

Я пытался работать с несколькими нажатых клавиш одновременно (например, и Вт или Вт и D). Решение ниже работает с одновременным нажатием нескольких клавиш (в том числе Ctrl, Shift, Alt и т. Д.). Я надеюсь, что кто-то другой найдет это полезным.

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 

Перейти здесь для первоначального обсуждения этого решения: How to get multiple key presses in single event?

Смежные вопросы