2011-12-22 17 views
5

Informazioni estranee: Sto tentando di creare un'applicazione utilizzando Qt. Questa applicazione presenta una QMdiArea e una finestra figlio. La finestra del mio bambino avrà un menu che può essere integrato nella QMdiArea o separato e collegato al bambino stesso. Anche se, questo è un po 'più in dettaglio del necessario ...Qt - Rimuovi collegamento - Sovraccarico ambiguo di scelta rapida

Problema: "CTRL + W" Vorrei che il mio bambino-widget di avere un menu con una scorciatoia, Ma, perché sto usando un QMdiArea, il collegamento è già utilizzato causando:

QAction :: eventFilter: sovraccarico scorciatoia ambiguo: Ctrl + W

Come posso liberarmi di questo collegamento e affermazione è invece nel mio widget figlio?

Aggiornamento: Ecco che cosa ho provato senza fortuna:

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

Questo funziona se faccio qualcosa di semplice come il cambiamento Qt::Key_W-Qt::Key_L. Il-combinazione di tasti viene ricevuto e l'evento viene lanciato . Con W, non succede mai. Ho anche provato a spostare event a QMainWindow e un eventFilter nella sottofinestra a QMdiArea. Sembra che sia un po 'troppo complicato fare qualcosa di semplice come rimuovere i gestori di chiavi predefiniti da QMdiArea.

risposta

0

Da quello che posso dire, quello che sto cercando non è possibile a meno di scrivere il mio 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.

Speriamo che a un certo punto qualcuno si confutare questa o QT sarà apportare modifiche. Nel frattempo, sembra che avremo tutti bisogno di stare lontano da queste scorciatoie preassegnate.

0

Sottoclasse QMdiArea e reimplementazione keyPressEvent(). Questo dovrebbe funzionare

void keyPressEvent(QKeyEvent* event){ 

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

È anche possibile utilizzare i filtri evento. Non mi basta la tua gerarchia di classe, ma spero che tu abbia l'idea.

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

Quindi non c'è un modo per disattivare il collegamento che QMdiArea creato?Fondamentalmente significa che se voglio usare la chiave scorciatoia devo usare le connessioni segnale/slot tra i due? – Serodis

+0

Inoltre, se questo è assolutamente l'unico modo, c'è qualche danno nel lasciare la scorciatoia ambigua? IE: installazione del collegamento sul menu dei widget? Non voglio davvero sacrificare il promemoria di scelta rapida "Ctrl + W" nella barra dei menu, poiché questo è il modo migliore per dire a un utente una funzione di scorciatoie. – Serodis

+0

Per modificare il comportamento predefinito di 'QMdiArea' in relazione a un evento chiave specifico, è necessario creare una sottoclasse e reimplementare' keyPressEvent() '. Un altro modo è utilizzare i filtri eventi. – Arlen

2

È possibile eliminare completamente l'azione di chiusura predefinita dello QMdiSubWindow utilizzando Qt::CustomizeWindowHint come contrassegno aggiuntivo quando si aggiunge la finestra secondaria.

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

sono stato in grado di ovviare a questo impostando il contesto scorciatoia per il mio vicino all'azione. Impostandolo su Qt::WidgetShortcut, non ho più l'ambiguo sovraccarico di collegamenti. Ecco come sto installando il mio vicino di azione ora:

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

È possibile disattivare questa scorciatoia in questo modo:

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