2012-04-30 24 views
8

Tôi đang ở trong tình huống mà tôi đang cố gắng đọc trong tệp cấu hình JSON, nó ra lệnh cho các lệnh khóa ánh xạ tới các hành động đã cho. Ví dụ:QKeySequence to QKeyEvent

... 
{ 
    "Action": "Quit", 
    "Combo" : "CTRL+Q" 
}, 
... 

Xây dựng một QKeySequence từ thẻ combo là tầm thường nhưng tôi cần phải theo dõi QKeyEvent s để kích hoạt hành động. Xin lưu ý rằng tôi để theo dõi QKeyEvent vì chúng cũng được sử dụng cho các mục đích khác trong ứng dụng. tức là nó sẽ không thể chấp nhận để chỉ giám sát các lệnh quan trọng cho QKeySequence s (nếu điều đó thậm chí có thể).

Viết ngắn trình phân tích cú pháp tùy chỉnh để tạo đối tượng QKeyEvent cho mỗi thẻ "Combo", có cách nào so sánh số với số QKeySequence không? Ví dụ:

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) { 
    //somehow convert to QKeyEvent 
} 
+0

Chỉ cần rõ ràng, sử dụng QAction :: setShortcut sẽ không làm những gì bạn muốn? – Anthony

Trả lời

3

Nói chung, bạn không thể so sánh QKeyEventQKeySequence đối tượng. QKeyEvent đại diện cho sự kiện của nhấn hoặc nhả phím duy nhất, trong khi QKeySequence có thể chứa một chuỗi gồm tối đa bốn khóa, mỗi khóa có thông tin bổ trợ tùy chọn.

Bạn có thể, tuy nhiên, so sánh các đối tượng nếu bạn chắc chắn rằng chuỗi chìa khóa của bạn sẽ luôn luôn chỉ chứa một khóa:

bool isEquiv(const QKeyEvent& event, const QKeySequence& seq) 
{ 
    if (seq.count() != 1) 
     return false; 
    return seq[0] == (event.key() | event.modifiers()); 
} 

Bạn thậm chí có thể viết một hàm chuyển đổi cho QKeyEvent để QKeySequence:

QKeySequence toKeySequence(const QKeyEvent& event) 
{ 
    return QKeySequence(event.key() | event.modifiers()); 
} 

Lưu ý rằng không có ý nghĩa khi chuyển đổi QKeySequence thành QKeyEvent, vì bạn phải chọn một loại sự kiện cụ thể như QEvent::KeyPress hoặc QEvent::KeyRelease.

0

A Qt4.7 note with code for converting KeyEvent to KeySequence. (Nhưng mã là sai lầm vì nó phôi một int cho keycode từ QKeyEvent.key() thành một chuỗi. Tốt hơn để sử dụng QKeyEvent.text()?)

Ngoài ra, các mã trong câu trả lời của Ferdinand :

QKeySequence(event.key() | event.modifiers()) 

không phải là loại an toàn (trộn int và QKeyboardModifiers) và nếu chuyển thành Python thất bại trong PyQt, nhưng không phải trong PySide?

Ngoài ra, "QKeyEvent đại diện cho sự kiện của một lần nhấn phím hoặc phát hành" không thực sự giải thích nó. Một QKeyEvent có thể cho bạn biết sự kết hợp của các phím là gì, không phải thứ tự mà chúng được nhấn. Khi người dùng nhấn các phím theo thứ tự, ứng dụng của bạn có thể nhận được một chuỗi các QKeyEvents (tùy thuộc vào việc ứng dụng của bạn đang sử dụng các trình xử lý mặc định hay bị ghi đè cho QKeyEvent.) Các QKeyEvents sau đó sẽ hiển thị cho bạn tất cả các phím đã bị tắt tại thời điểm diễn ra sự kiện . Chúng có thể không còn nữa. Nó khá phức tạp.

4

Một giải pháp đơn giản (viết bằng python):

key = QKeySequence(event.modifiers()|event.key()).toString() 

sẽ cung cấp cho bạn toàn bộ chuỗi dưới dạng chuỗi, chẳng hạn như "Ctrl + Q".

Lợi ích là (ít nhất là trong python) mà bạn có thể tìm thấy trong một dict của phím tắt, trong khi một QKeySequence sẽ không có băm.

Hãy coi chừng điều này dự kiến ​​bạn sử dụng đúng kiểu chữ và khoảng trắng. "ctrl + Q" sẽ không khớp. Để tránh tất cả các vấn đề, bạn có thể làm như sau khi lần đầu tiên đọc các phím tắt:

shortcut = shortcut.lower().remove(' ') 

và kết hợp/tìm sử dụng

key = QKeySequence(event.modifiers()|event.key()).toString().lower() 

hoặc tốt hơn nào:

shortcut = QKeySequence(shortcut).toString() 

và trận đấu trực tiếp.