void QGroupBox::fixFocus() { QFocusData * fd = focusData(); QWidget * orig = fd->home(); QWidget * best = 0; QWidget * candidate = 0; QWidget * w = orig; do { QWidget * p = w; while( p && p != this && !p->isTopLevel() ) p = p->parentWidget(); if ( p == this && ( w->focusPolicy() & TabFocus ) == TabFocus && w->isVisibleTo(this) ) { if ( w->hasFocus() #ifndef QT_NO_RADIOBUTTON || ( !best && ::qt_cast<QRadioButton*>(w) && ((QRadioButton*)w)->isChecked() ) #endif ) // we prefer a checked radio button or a widget that // already has focus, if there is one best = w; else if ( !candidate ) // but we'll accept anything that takes focus candidate = w; } w = fd->next(); } while( w != orig ); if ( best ) best->setFocus(); else if ( candidate ) candidate->setFocus(); }
void QWidgetStack::raiseWidget( QWidget *w ) { if ( !w || w == invisible || w->parent() != this || w == topWidget ) return; if ( id(w) == -1 ) addWidget( w ); if ( !isVisible() ) { topWidget = w; return; } if (w->maximumSize().width() < invisible->width() || w->maximumSize().height() < invisible->height()) invisible->setBackgroundMode(backgroundMode()); else if (invisible->backgroundMode() != NoBackground) invisible->setBackgroundMode(NoBackground); if ( invisible->isHidden() ) { invisible->setGeometry( contentsRect() ); invisible->lower(); invisible->show(); QApplication::sendPostedEvents( invisible, QEvent::ShowWindowRequest ); } // try to move focus onto the incoming widget if focus // was somewhere on the outgoing widget. if ( topWidget ) { QWidget * fw = focusWidget(); QWidget* p = fw; while ( p && p != topWidget ) p = p->parentWidget(); if ( p == topWidget ) { // focus was on old page if ( !focusWidgets ) focusWidgets = new QPtrDict<QWidget>( 17 ); focusWidgets->replace( topWidget, fw ); fw->clearFocus(); // look for the best focus widget we can find // best == what we had (which may be deleted) fw = focusWidgets->take( w ); if ( isChildOf( fw, w ) ) { fw->setFocus(); } else { // second best == first child widget in the focus chain QFocusData *f = focusData(); QWidget* home = f->home(); QWidget *i = home; do { if ( ( ( i->focusPolicy() & TabFocus ) == TabFocus ) && !i->focusProxy() && i->isVisibleTo(w) && i->isEnabled() ) { p = i; while ( p && p != w ) p = p->parentWidget(); if ( p == w ) { i->setFocus(); break; } } i = f->next(); } while( i != home ); } } } if ( isVisible() ) { emit aboutToShow( w ); int i = id( w ); if ( i != -1 ) emit aboutToShow( i ); } topWidget = w; const QObjectList * c = children(); QObjectListIt it( *c ); QObject * o; while( (o=it.current()) != 0 ) { ++it; if ( o->isWidgetType() && o != w && o != invisible ) ((QWidget *)o)->hide(); } w->setGeometry( invisible->geometry() ); w->show(); }