VirtualBox

Changeset 44572 in vbox


Ignore:
Timestamp:
Feb 6, 2013 3:08:28 PM (12 years ago)
Author:
vboxsync
Message:

FE/Qt: QIMainDialog: Less global key event handling allowing children to handle them first.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/extensions
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIMainDialog.cpp

    r44529 r44572  
    247247}
    248248
     249void QIMainDialog::keyPressEvent(QKeyEvent *pEvent)
     250{
     251#if defined (Q_WS_MAC) && (QT_VERSION < 0x040402)
     252    /* Bug in Qt below 4.4.2.
     253     * The key events are send to the current window even if a menu is shown & has the focus.
     254     * See http://trolltech.com/developer/task-tracker/index_html?method=entry&id=214681. */
     255    if (::darwinIsMenuOpen())
     256        return;
     257#endif /* defined (Q_WS_MAC) && (QT_VERSION < 0x040402) */
     258
     259    /* Make sure that we only proceed if no
     260     * popup or other modal widgets are open. */
     261    if (qApp->activePopupWidget() ||
     262        (qApp->activeModalWidget() && qApp->activeModalWidget() != this))
     263    {
     264        /* Call to base-class: */
     265        return QMainWindow::keyPressEvent(pEvent);
     266    }
     267
     268    /* Special handling for some keys: */
     269    switch (pEvent->key())
     270    {
     271        /* Special handling for Escape key: */
     272        case Qt::Key_Escape:
     273        {
     274            if (pEvent->modifiers() == Qt::NoModifier)
     275            {
     276                reject();
     277                return;
     278            }
     279            break;
     280        }
     281#ifdef Q_WS_MAC
     282        /* Special handling for Period key: */
     283        case Qt::Key_Period:
     284        {
     285            if (pEvent->modifiers() == Qt::ControlModifier)
     286            {
     287                reject();
     288                return;
     289            }
     290            break;
     291        }
     292#endif /* Q_WS_MAC */
     293        /* Special handling for Return/Enter key: */
     294        case Qt::Key_Return:
     295        case Qt::Key_Enter:
     296        {
     297            if (((pEvent->modifiers() == Qt::NoModifier) && (pEvent->key() == Qt::Key_Return)) ||
     298                ((pEvent->modifiers() & Qt::KeypadModifier) && (pEvent->key() == Qt::Key_Enter)))
     299            {
     300                if (QPushButton *pCurrentDefault = searchDefaultButton())
     301                {
     302                    pCurrentDefault->animateClick();
     303                    return;
     304                }
     305            }
     306            break;
     307        }
     308        /* Default handling for others: */
     309        default: break;
     310    }
     311    /* Call to base-class: */
     312    return QMainWindow::keyPressEvent(pEvent);
     313}
     314
    249315bool QIMainDialog::eventFilter (QObject *aObject, QEvent *aEvent)
    250316{
     
    286352            break;
    287353        }
    288         case QEvent::KeyPress:
    289         {
    290 #if defined (Q_WS_MAC) && (QT_VERSION < 0x040402)
    291             /* Bug in Qt below 4.4.2. The key events are send to the current
    292              * window even if a menu is shown & has the focus. See
    293              * http://trolltech.com/developer/task-tracker/index_html?method=entry&id=214681. */
    294             if (::darwinIsMenuOpen())
    295                 return true;
    296 #endif /* defined (Q_WS_MAC) && (QT_VERSION < 0x040402) */
    297             /* Make sure that we only proceed if no
    298              * popup or other modal widgets are open. */
    299             if (qApp->activePopupWidget() ||
    300                 (qApp->activeModalWidget() && qApp->activeModalWidget() != this))
    301                 break;
    302 
    303             QKeyEvent *event = static_cast<QKeyEvent*> (aEvent);
    304 #ifdef Q_WS_MAC
    305             if (event->modifiers() == Qt::ControlModifier &&
    306                 event->key() == Qt::Key_Period)
    307                 reject();
    308             else
    309 #endif
    310                 if (event->modifiers() == Qt::NoModifier ||
    311                     (event->modifiers() & Qt::KeypadModifier && event->key() == Qt::Key_Enter))
    312                 {
    313                     switch (event->key())
    314                     {
    315                         case Qt::Key_Enter:
    316                         case Qt::Key_Return:
    317                         {
    318                             QPushButton *currentDefault = searchDefaultButton();
    319                             if (currentDefault)
    320                             {
    321                                 /* We handle this, so return true after
    322                                  * that. */
    323                                 currentDefault->animateClick();
    324                                 return true;
    325                             }
    326                             break;
    327                         }
    328                         case Qt::Key_Escape:
    329                         {
    330                             reject();
    331                             return true;
    332                         }
    333                         default:
    334                             break;
    335                     }
    336                 }
    337         }
    338354        default:
    339355            break;
  • trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIMainDialog.h

    r44529 r44572  
    5959    virtual void showEvent (QShowEvent *aEvent);
    6060    virtual void resizeEvent (QResizeEvent *aEvent);
     61    virtual void keyPressEvent(QKeyEvent *pEvent);
    6162    virtual bool eventFilter (QObject *aObject, QEvent *aEvent);
    6263
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette