2010-06-20 7 views
5

Qt 4.6 kullanıyorum ve bekletilmekte olan çoklu tuş kombinasyonlarına (örneğin, Key_Q + Key_W) yanıt vermek istiyorum. Bu yüzden, bir tuş kombinasyonunu basılı tuttuğunuzda, olay her zaman, sadece tek anahtar olaylarla çalıştığı şekilde çağrılmalıdır. Onlar için autoRepeat QShortcuts kullanmak ve etkinleştirmek için çalıştı, ancak bu işe yaramadı: Qt çok tuşlu combo olayı

keyCombos_.push_back(new QShortcut(QKeySequence(Qt::Key_W, Qt::Key_D), this)); 
connect(keyCombos_[0], SIGNAL(activated()), SLOT(keySequenceEvent_WD())); 
setShortcutAutoRepeat(keyCombos_[0]->id(), true); 

Ben de tek Key_W yakalamak (veya ne olursa olsun ilk Anahtar edemez sorun var bu yaklaşımı kullanırken keysequence is) artık vuruş.

sayesinde Thomas

cevap

6

QShortcut aradığınız işlevi desteklemez. Yalnızca Shift, Ctrl, Alt ve Meta gibi değiştirici tuşları ile kombinasyonlar oluşturabilirsiniz. kodunuzu ne yapar

kullanıcı ilk presler W ve daha sonra D. Bu cevap diğer kısayolları ile çelişmesi neden de olduğunda yanıt veren bir kısayol yapmaktır sadece

yapmak istediğiniz W.

Hem W hem de D aynı anda tuşlarına basıldığında, basılı durumlarını takip etmek için QWidget'ın keyPressEvent ve keyReleaseEvent yöntemlerini geçersiz kılmanız ve her ikisi de basıldıktan sonra işleyici işlevinizi el ile çağırmanız gerekir. Kullanıma uygun bir QWidget alt sınıfınız yoksa ya tanıtmanız gerekecek ya da QObject::installEventFilter kullanarak, muhtemelen uygulama nesnesinde genel bir kısayol olması gerekiyorsa, bir olay filtresi doğru yere yükleyin.

3

Basılı tuş takımına basılı bir tuş ekleyebilir ve tuş bırakıldığında bu setten çıkabilirsiniz. Yani bir sınıf üyesi olan bir QSet için basılan tuşu ekleyebilirsiniz:

QSet<int> pressedKeys; 

Bir olay filtresinde önemli olayları yakalayabilirsiniz:

bool MyWidget::eventFilter(QObject * obj, QEvent * event) 
{ 

    if(event->type()==QEvent::KeyPress) { 

     pressedKeys += ((QKeyEvent*)event)->key(); 

     f(pressedKeys.contains(Qt::Key_D) && pressedKeys.contains(Qt::Key_W)) 
     { 
      // D and W are pressed 
     } 

    } 
    else if(event->type()==QEvent::KeyRelease) 
    { 

     pressedKeys -= ((QKeyEvent*)event)->key(); 
    } 


    return false; 
} 

olay filtresi yüklemek unutmayın Yapıcıda:

this->installEventFilter(this); 
+0

Teşekkür ederiz. Bu, anlaşılması kolay ve kolaydır. – GoodDeeds