2011-12-22 9 views
5

Dodatkowe informacje: Próbuję utworzyć aplikację przy użyciu Qt. Ta aplikacja zawiera QMdiArea i okno potomne. Moje okienko-dziecko będzie miało menu, które można zintegrować z QMdiArea lub posegregować i dołączyć do samego dziecka. Choć jest to nieco bardziej szczegółowo niż potrzeba ...Qt - Usuń skrót - Niejednoznaczne przeciążenie skrótem

Problem: „Ctrl + W” Chciałbym moje dziecko-widget mieć menu z skrótów Ale, ponieważ używam QMdiArea, skrót jest już używany powodując:

QAction :: eventFilter: niejednoznaczne przeciążenie skrótu: Ctrl + W

Jak mogę pozbyć się tego skrótu i ​​roszczenia zamiast tego w moim widżecie podrzędnym?

Aktualizacja: Oto co próbowałem bez powodzenia:

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

To działa, jeśli zrobię coś tak prostego jak zmiana Qt::Key_W do Qt::Key_L. otrzymaniu Klucz-kombi i zdarzenie zostanie wrzucony . Z W, po prostu nigdy się to nie zdarza. Próbowałem również przenieść event do QMainWindow, jak również eventFilter w oknie podrzędnym do QMdiArea. Wydaje się, że jest trochę zbyt skomplikowane, aby zrobić coś tak prostego, jak usunąć domyślne klawisze obsługi z poziomu QMdiArea.

Odpowiedz

0

Z tego co wiem, to, czego szukam, nie jest możliwe bez napisania mojego MDIArea.

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.

Mam nadzieję, że w pewnym momencie ktoś będzie obalić ten lub QT będzie dokonać zmian. Tymczasem wygląda na to, że wszyscy będziemy musieli trzymać się z dala od tych wcześniej przypisanych skrótów.

0

Podklasa QMdiArea i reimplementacja keyPressEvent(). To powinno działać.

void keyPressEvent(QKeyEvent* event){ 

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

Można również użyć filtrów zdarzeń. Nie mam wystarczającej wiedzy na temat twojej hierarchii klasowej, ale mam nadzieję, że wpadniesz na ten pomysł.

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

Tak jest w żaden sposób wyłączyć skrót QMdiArea stworzył?Zasadniczo oznacza to, że jeśli chcę używać skrótu klawiszowego, muszę użyć połączeń sygnał/gniazdo między tymi dwoma? – Serodis

+0

Ponadto, jeśli jest to absolutnie jedyny sposób, czy istnieje jakakolwiek szkoda w opuszczaniu niejednoznacznego skrótu? IE: Instalowanie skrótu w menu widżetów? Naprawdę nie chcę poświęcać przypomnienia skrótu "Ctrl + W" w pasku menu, ponieważ jest to najlepszy sposób, aby poinformować użytkownika o funkcji skrótów. – Serodis

+0

Aby zmienić domyślne zachowanie 'QMdiArea' w odniesieniu do określonego zdarzenia klucza, należy go podklasować i ponownie zaimplementować' keyPressEvent() '. Innym sposobem jest użycie filtrów zdarzeń. – Arlen

2

Możesz całkowicie zrezygnować ze zdefiniowanej akcji zamknięcia QMdiSubWindow łącznie, używając Qt::CustomizeWindowHint jako dodatkowej flagi podczas dodawania okna podrzędnego.

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

Udało mi się obejść ten problem, ustawiając kontekst skrótów dla moich działań zamkniętych. Ustawiając ją na Qt::WidgetShortcut, nie mam już niejednoznacznego przeciążenia skrótu. Oto jak ja skonfigurowaniu bliskie działania teraz:

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

Można wyłączyć ten skrót tak:

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