2011-12-22 8 views
5

Información extraña: Estoy intentando construir una aplicación usando Qt. Esta aplicación presenta un QMdiArea y una ventana hija. My child-window tendrá un menú que se puede integrar en QMdiArea o segregar y adjuntar al propio niño. Sin embargo, esto es un poco más detalle de lo necesario ...Qt - Eliminar atajo - Sobrecarga de acceso directo ambiguo

Problema: me gustaría que mi hijo-widget para tener un menú con un acceso directo, "CTRL + W". Pero, porque yo estoy usando un QMdiArea, el acceso directo se utiliza ya que causa:

QAction :: EventFilter: sobrecarga de acceso directo ambiguo: Ctrl + W

¿Cómo puedo deshacerme de este acceso directo y reclamo dentro de mi widget hijo en su lugar?

Actualización: Aquí es lo que he intentado sin suerte:

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

Esto funciona si hago algo tan simple como el cambio Qt::Key_W-Qt::Key_L. La clave-combo se recibe y el evento se lanza . Con W, simplemente nunca sucede. También intenté mover event a QMainWindow, así como un eventFilter en la subventana a QMdiArea. Parece que es un poco demasiado complicado hacer algo tan simple como eliminar key-handlers por defecto desde dentro de QMdiArea.

Respuesta

0

Subclase QMdiArea y reimplemento keyPressEvent(). Eso debería funcionar.

void keyPressEvent(QKeyEvent* event){ 

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

También podría utilizar los filtros de eventos. No me basta con tu jerarquía de clases, pero espero que entiendas la 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

Entonces, ¿hay ninguna manera de desactivar el acceso directo que creó QMdiArea?Básicamente significa que si quiero usar la tecla de acceso directo, ¿debo usar conexiones de señal/ranura entre las dos? – Serodis

+0

Además, si eso es absolutamente la única manera, ¿hay algún daño al dejar el acceso directo ambiguo? IE: ¿Instalando el acceso directo en el menú de widgets? Realmente no quiero sacrificar el recordatorio de acceso directo "Ctrl + W" en la barra de menú, ya que es la mejor manera de decirle a un usuario una función de accesos directos. – Serodis

+0

Para alterar el comportamiento predeterminado de 'QMdiArea' con respecto a un evento clave específico es subclasificarlo y volver a implementar' keyPressEvent() '. Otra forma es usar filtros de eventos. – Arlen

2

Puede deshacerse por completo de la acción de cierre predefinida del QMdiSubWindow usando Qt::CustomizeWindowHint como indicador adicional al agregar la subventana.

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

Pude solucionar esto estableciendo el contexto de acceso directo para mi acción de cierre. Al establecerlo en Qt::WidgetShortcut, ya no obtengo la sobrecarga de acceso directo ambigua. Así es como yo estoy fijando mi acción cerca ahora:

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

se puede desactivar este acceso directo de la siguiente manera:

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