2011-07-11 8 views
10

Muszę to zrobić, aby skonfigurować moją aplikację. Mam pole QLineEdit z reimplementowaną metodą keyPressEvent.Jak mogę przechwycić QKeySequence z QKeyEvent w zależności od aktualnego układu klawiatury?

QKeyEvent *ke = ... 
QString txt; 

if(ke->modifiers() & Qt::ControlModifier) 
    txt += "Ctrl+"; 
if(ke->modifiers() & Qt::AltModifier) 
    txt += "Alt+"; 
if(ke->modifiers() & Qt::ShiftModifier) 
    txt += "Shift+"; 

if(ke->key() >= Qt::Key_0 && ke->key() <= Qt::Key_9) 
    txt += ('0' + ke->key() - Qt::Key_0); 
else if(ke->key() >= Qt::Key_A && ke->key() <= Qt::Key_Z) 
    txt += ('A' + ke->key() - Qt::Key_A); 
ui->hotkeyEdit->setText(txt); 

Ale to rozwiązanie może tworzyć skróty tylko z angielskimi znakami. Na przykład, gdy używam rosyjskiego układu klawiatury, ten kod wyświetli tę samą sekwencję, ale z angielskim char, umieszczonym na tym samym klawiszu klawiatury.

Odpowiedz

17

To, co może być bardzo przydatne, to funkcja QKeySequance(). ToString().

Poniżej znajduje się część kodu, którego używam do tworzenia skrótów zdefiniowanych przez użytkownika. Mając pewne modyfikacje, może zrobić wszystko, czego potrzebujesz w swoim projekcie. Nadzieję, że to pomaga (przepraszam za crapped wcięć):

if (event->type() == QEvent::KeyPress){ 
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); 

    int keyInt = keyEvent->key(); 
    Qt::Key key = static_cast<Qt::Key>(keyInt); 
    if(key == Qt::Key_unknown){ 
     qDebug() << "Unknown key from a macro probably"; 
     return; 
    } 
    // the user have clicked just and only the special keys Ctrl, Shift, Alt, Meta. 
    if(key == Qt::Key_Control || 
     key == Qt::Key_Shift || 
     key == Qt::Key_Alt || 
     key == Qt::Key_Meta) 
    { 
     qDebug() << "Single click of special key: Ctrl, Shift, Alt or Meta"; 
     qDebug() << "New KeySequence:" << QKeySequence(keyInt).toString(QKeySequence::NativeText); 
     return; 
    } 

    // check for a combination of user clicks 
    Qt::KeyboardModifiers modifiers = keyEvent->modifiers(); 
    QString keyText = keyEvent->text(); 
    // if the keyText is empty than it's a special key like F1, F5, ... 
    qDebug() << "Pressed Key:" << keyText; 

    QList<Qt::Key> modifiersList; 
    if(modifiers & Qt::ShiftModifier) 
     keyInt += Qt::SHIFT; 
    if(modifiers & Qt::ControlModifier) 
     keyInt += Qt::CTRL; 
    if(modifiers & Qt::AltModifier) 
     keyInt += Qt::ALT; 
    if(modifiers & Qt::MetaModifier) 
     keyInt += Qt::META; 

    qDebug() << "New KeySequence:" << QKeySequence(keyInt).toString(QKeySequence::NativeText); 
} 
2

Preferuj standard seqence.

Z Keyboard Layout Issues:

W rezultacie oba czytelny dla człowieka smyczki i zakodowany klucz kody mogą zarówno być problematyczne w użyciu podczas określania sekwencji klawiszy, które mogą być używane na różnych inną klawiaturę układy. Tylko używanie standardowych skrótów gwarantuje, że użytkownik będzie mógł korzystać ze skrótów przeznaczonych dla programisty.

+0

Chcę użytkownik może ustawić własne skróty do działania. –

3

Możesz przypisać skróty klawiaturowe do czynności.

Oto niektóre sposoby, aby to zrobić.

actionName->setShortcut(QKeySequence::New); //for predefined shortcuts like new, close, open.. 

można też zdefiniować własne skróty z tego

actionName->setShortcut(QKeySequence("Ctrl+N")); // sets Ctrl + N for w.e the action does 

W pierwszym przypadku qt automatycznie wykrywa i przyporządkowuje odpowiedni skrót do danego działania. W drugim przypadku możesz wybrać własny pożądany skrót i wpisać go jako ciąg. Automatycznie je analizuje i rozumie.

Pozwala to uniknąć niepotrzebnych zastosowań przechwytywania kluczy.

5

Jeśli ktoś dba o wersji Pythona w roztworze Tihomir Dolapchiev powyżej. Właśnie to przetłumaczyłem i działa świetnie. Po prostu publikuj na przyszłość.

class KeySequenceEdit(QtGui.QLineEdit): 
    """ 
    This class is mainly inspired by 
    http://stackoverflow.com/a/6665017 

    """ 

    def __init__(self, keySequence, *args): 
     super(KeySequenceEdit, self).__init__(*args) 

     self.keySequence = keySequence 
     self.setKeySequence(keySequence) 

    def setKeySequence(self, keySequence): 
     self.keySequence = keySequence 
     self.setText(self.keySequence.toString(QtGui.QKeySequence.NativeText)) 


    def keyPressEvent(self, e): 
     if e.type() == QtCore.QEvent.KeyPress: 
      key = e.key() 

      if key == QtCore.Qt.Key_unknown: 
       warnings.warn("Unknown key from a macro probably") 
       return 

      # the user have clicked just and only the special keys Ctrl, Shift, Alt, Meta. 
      if(key == QtCore.Qt.Key_Control or 
      key == QtCore.Qt.Key_Shift or 
      key == QtCore.Qt.Key_Alt or 
      key == QtCore.Qt.Key_Meta): 
       print("Single click of special key: Ctrl, Shift, Alt or Meta") 
       print("New KeySequence:", QtGui.QKeySequence(key).toString(QtGui.QKeySequence.NativeText)) 
       return 

      # check for a combination of user clicks 
      modifiers = e.modifiers() 
      keyText = e.text() 
      # if the keyText is empty than it's a special key like F1, F5, ... 
      print("Pressed Key:", keyText) 

      if modifiers & QtCore.Qt.ShiftModifier: 
       key += QtCore.Qt.SHIFT 
      if modifiers & QtCore.Qt.ControlModifier: 
       key += QtCore.Qt.CTRL 
      if modifiers & QtCore.Qt.AltModifier: 
       key += QtCore.Qt.ALT 
      if modifiers & QtCore.Qt.MetaModifier: 
       key += QtCore.Qt.META 

      print("New KeySequence:", QtGui.QKeySequence(key).toString(QtGui.QKeySequence.NativeText)) 

      self.setKeySequence(QtGui.QKeySequence(key)) 
2

Najprostszym sposobem jest:

if(event->type() == QEvent::KeyPress) 
{ 
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); 
    qDebug() << "delete" << keyEvent->matches(QKeySequence::Delete); 
    qDebug() << "copy" << keyEvent->matches(QKeySequence::Copy); 
    qDebug() << "paste" << keyEvent->matches(QKeySequence::Paste); 
} 
Powiązane problemy