2011-12-22 40 views
5

Thông tin không liên quan: Tôi đang cố gắng xây dựng một ứng dụng bằng Qt. Ứng dụng này có một QMdiArea và một cửa sổ con. Cửa sổ con của tôi sẽ có một trình đơn có thể được tích hợp vào QMdiArea hoặc tách biệt và gắn liền với chính đứa trẻ đó. Mặc dù, chi tiết này có chi tiết hơn một chút so với yêu cầu ...Qt - Xóa phím tắt - Quá tải tắt không rõ ràng

Sự cố: Tôi muốn tiện ích con của tôi có menu có phím tắt "CTRL + W". Nhưng, vì tôi đang sử dụng một QMdiArea, các phím tắt đã được sử dụng gây ra:

QAction :: eventFilter: mơ hồ quá tải shortcut: Ctrl + W

Làm thế nào tôi có thể thoát khỏi shortcut này và tuyên bố nó trong tiện ích con của tôi thay thế?

Cập nhật: Dưới đây là những gì tôi đã cố gắng không có may mắn:

class MDI : public QMdiArea 
{ 
    Q_OBJECT 
    private: 
    bool event(QEvent *tEvent) 
    { 
     if (tEvent->type() == QEvent::KeyPress) 
     { 
      QKeyEvent* ke = static_cast<QKeyEvent*>(tEvent); 
      if (ke->key()== Qt::Key_W && ke->modifiers() & Qt::ControlModifier) 
      emit KeyCW(); 
      return true; 
     } 
     return QMdiArea::event(tEvent); 
    } 
public: 
signals: 
    void KeyCW(); 
}; 

này hoạt động nếu tôi làm điều gì đó đơn giản như thay đổi Qt::Key_W-Qt::Key_L. Chìa khóa-combo được nhận và sự kiện được ném . Với W, nó không bao giờ xảy ra. Tôi cũng đã thử di chuyển event sang QMainWindow cũng như một EventFilter trong subwindow tới QMdiArea. Dường như nó hơi quá phức tạp để làm điều gì đó đơn giản như loại bỏ các trình xử lý khóa mặc định từ bên trong QMdiArea.

Trả lời

0

Từ những gì tôi có thể nói, điều tôi đang tìm kiếm không thể viết tắt MDIArea của riêng mình.

The shortcut is set in QMdiSubWindowPrivate::createSystemMenu() during the construction of a QMdiSubWindow, I doubt that you can remove it without having to patch Qt libs.

Hy vọng rằng tại một số điểm ai đó sẽ bác bỏ này hoặc QT sẽ thực hiện thay đổi. Trong khi đó, có vẻ như tất cả chúng ta sẽ cần phải tránh xa các phím tắt được gán trước này.

0

Phân lớp QMdiArea và triển khai lại keyPressEvent(). Cần làm việc.

void keyPressEvent(QKeyEvent* event){ 

    if(event->key() == Qt::Key_W and event->modifiers() & Qt::ControlModifier){ 
     // handle it 
    }else{ 
     return QMdiArea::keyPressEvent(event); 
    } 
    } 

Bạn cũng có thể sử dụng bộ lọc sự kiện. Tôi không đủ về phân cấp lớp học của bạn, nhưng tôi hy vọng bạn có được ý tưởng.

bool CustomMdiArea::eventFilter(QObject *object, QEvent *event){ 
    if(object == yourChildWindow && event->type() == QEvent::KeyPress) { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
     if(keyEvent->key() == Qt::Key_W and keyEvent->modifiers() & Qt::ControlModifier) { 
      //handle it 
      return true; 
     }else{ 
      return false; 
     } 
    } 
    return false; 
} 
+0

Vậy là không có cách nào để vô hiệu hóa các phím tắt mà QMdiArea tạo?Về cơ bản có nghĩa là nếu tôi muốn sử dụng khóa cắt ngắn, tôi phải sử dụng các kết nối tín hiệu/khe giữa hai thiết bị? – Serodis

+0

Ngoài ra, nếu đó là cách tuyệt đối duy nhất, có bất kỳ tác hại nào trong việc rời khỏi lối tắt không rõ ràng không? IE: Cài đặt phím tắt trên menu widget? Tôi thực sự không muốn hy sinh lời nhắc phím tắt "Ctrl + W" trong thanh menu, vì đó là cách tốt nhất để cho người dùng biết chức năng phím tắt. – Serodis

+0

Để thay đổi hành vi mặc định của 'QMdiArea' liên quan đến một sự kiện quan trọng cụ thể là phân lớp nó và thực hiện lại' keyPressEvent() '. Một cách khác là sử dụng bộ lọc sự kiện. – Arlen

2

Bạn có thể thoát khỏi những hành động gần gũi được xác định trước của QMdiSubWindow hoàn toàn bằng cách sử dụng Qt::CustomizeWindowHint như cờ bổ sung khi thêm subwindow.

QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2, 
               Qt::Widget | Qt::CustomizeWindowHint | 
               Qt::WindowMinMaxButtonsHint); 
0

Tôi đã có thể giải quyết vấn đề này bằng cách đặt ngữ cảnh phím tắt cho hành động gần gũi của tôi. Bằng cách đặt nó thành Qt::WidgetShortcut, tôi không còn nhận được quá tải phím tắt không rõ ràng. Dưới đây là làm thế nào Tôi đang thiết lập hành động chặt chẽ của tôi bây giờ:

closeAction = new QAction(tr("&Close"), this); 
    closeAction->setShortcut(Qt::CTRL|Qt::Key_W); 
    closeAction->setShortcutContext(Qt::WidgetShortcut); 
    connect(closeAction, SIGNAL(triggered()), mdiArea, SLOT(closeActiveSubWindow())); 
0

Bạn có thể vô hiệu hóa shortcut này như thế này:

for(QAction *action : subWindow->systemMenu()->actions()) { 
    if(action->shortcut() == QKeySequence(QKeySequence::Close)) { 
     action->setShortcut(QKeySequence()); 
     break; 
    } 
}