2010-06-20 45 views
5

Tôi đang sử dụng Qt 4.6 và tôi muốn phản ứng với các combo đa khóa (ví dụ: Key_Q + Key_W) đang được giữ. Vì vậy, khi bạn giữ một tổ hợp phím, sự kiện nên được gọi là tất cả các thời gian, chỉ giống như cách nó hoạt động với các sự kiện quan trọng duy nhất. Tôi cố gắng để sử dụng QShortcuts và cho phép Autorepeat cho họ, nhưng điều đó không làm việc:Sự kiện kết hợp nhiều phím Qt

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); 

Khi sử dụng phương pháp này tôi cũng có vấn đề mà tôi không thể bắt single Key_W (hoặc bất kỳ khóa đầu tiên trong hậu quả là) đột quỵ nữa.

Cảm ơn, Thomas

Trả lời

6

QShortcut không hỗ trợ các chức năng bạn đang tìm kiếm. Bạn chỉ có thể thực hiện kết hợp với các phím sửa đổi như Shift, Ctrl, Alt và Meta.

gì mã của bạn làm là để tạo ra một shortcut đáp ứng khi người dùng máy ép đầu tiên W và sau đó D. Đây cũng là lý do tại sao nó sẽ mâu thuẫn với các phím tắt khác mà đáp lại chỉ W.

Khi bạn muốn làm một cái gì đó khi cả hai W và D được nhấn cùng một lúc, bạn sẽ phải ghi đè các phương pháp keyPressEventkeyReleaseEvent của QWidget để theo dõi trạng thái đã nhấn của chúng và gọi theo cách thủ công chức năng xử lý của bạn khi chúng được nhấn cả hai. Nếu bạn không có phân lớp QWidget phù hợp, bạn có thể phải giới thiệu nó hoặc cài đặt bộ lọc sự kiện ở đúng nơi bằng cách sử dụng QObject::installEventFilter, có thể trên đối tượng ứng dụng của bạn nếu nó được cho là một lối tắt chung.

3

Bạn có thể thêm một phím bấm vào bộ phím bấm và xóa khỏi bộ này khi phím được nhả. Vì vậy, bạn có thể thêm phím bấm để một QSet mà là một thành viên lớp:

QSet<int> pressedKeys; 

Bạn có thể nắm bắt những sự kiện quan trọng trong một bộ lọc sự kiện:

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; 
} 

Đừng quên để cài đặt các bộ lọc sự kiện trong hàm tạo:

this->installEventFilter(this); 
+0

Cảm ơn bạn. Điều này rất hữu ích và dễ hiểu. – GoodDeeds

Các vấn đề liên quan