2011-07-11 35 views
10

Tôi cần thực hiện việc này để định cấu hình ứng dụng của mình. Tôi có trường QLineEdit với phương thức keyPressEvent được thực hiện lại.Làm thế nào tôi có thể chụp QKeySequence từ QKeyEvent tùy thuộc vào bố cục bàn phím hiện tại?

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

Nhưng giải pháp này chỉ có thể tạo lối tắt bằng ký tự tiếng Anh. Ví dụ khi tôi sử dụng bố trí bàn phím tiếng Nga, mã này sẽ hiển thị cùng một trình tự nhưng với char tiếng anh, được đặt trên cùng một phím trên bàn phím.

Trả lời

17

Điều bạn có thể thấy rất hữu ích là hàm QKeySequance(). ToString().

Sau đây là một phần của mã mà tôi sử dụng để viết tắt Phím tắt do người dùng xác định. Với một số sửa đổi nó có thể làm bất cứ điều gì bạn cần trong dự án của bạn. Hy vọng điều này sẽ giúp (xin lỗi vì nhận dạng bị quấy rối):

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

Ưu tiên standard seqence.

Từ Keyboard Layout Issues:

Kết quả là, cả hai chuỗi con người có thể đọc được và mã chìa khóa mã hóa cứng cả hai có thể có vấn đề để sử dụng khi xác định một dãy phím có thể được sử dụng trên một loạt các bàn phím khác nhau bố cục. Chỉ việc sử dụng các phím tắt chuẩn đảm bảo rằng người dùng sẽ có thể sử dụng các phím tắt mà nhà phát triển dự định.

+0

tôi muốn người dùng có thể thiết lập phím tắt riêng của mình cho hành động. –

3

Bạn có thể gán phím tắt cho thao tác.

Dưới đây là một số cách để thực hiện.

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

hoặc bạn có thể định nghĩa phím tắt của riêng bạn với điều này

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

Trong trường hợp đầu tiên qt tự động dò tìm và gán các phím tắt thích hợp cho hành động cụ thể. Trong trường hợp thứ hai, bạn có thể chọn lối tắt mong muốn của riêng mình và nhập nó làm chuỗi. Nó tự động phân tích nó và hiểu.

Điều này tránh sự cần thiết phải sử dụng các ảnh chụp chính cho các mục đích không cần thiết.

5

Nếu ai đó quan tâm đến phiên bản python của dung dịch Tihomir Dolapchiev ở trên. Tôi chỉ dịch nó và nó hoạt động tuyệt vời. Chỉ cần đăng để tham khảo trong tương lai.

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

cách đơn giản nhất là:

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); 
} 
Các vấn đề liên quan