⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qpemenubar.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#define INCLUDE_MENUITEM_DEF#include "qpemenubar.h"#include <qapplication.h>#include <qguardedptr.h>#include <qtimer.h>class QMenuBarHack : public QMenuBar{public:    int activeItem() const { return actItem; }    void goodbye()    {	activateItemAt(-1);	for ( unsigned int i = 0; i < count(); i++ ) {	    QMenuItem *mi = findItem( idAt(i) );	    if ( mi->popup() ) {		mi->popup()->hide();	    }	}    }};QPEMenuToolFocusManager *QPEMenuToolFocusManager::me = 0;QPEMenuToolFocusManager::QPEMenuToolFocusManager() : QObject(){    qApp->installEventFilter( this );}void QPEMenuToolFocusManager::addWidget( QWidget *w ){    list.append( GuardedWidget(w) );}void QPEMenuToolFocusManager::removeWidget( QWidget *w ){    list.remove( GuardedWidget(w) );}void QPEMenuToolFocusManager::setActive( bool a ){    if ( a ) {	oldFocus = qApp->focusWidget();	QValueList<GuardedWidget>::Iterator it;	it = list.begin();	while ( it != list.end() ) {	    QWidget *w = (*it);	    if ( w && w->isEnabled() && w->isVisible() &&		 w->topLevelWidget() == qApp->activeWindow() ) {		setFocus( w );		return;	    }	    ++it;	}    } else {	if ( inFocus ) {	    if ( inFocus->inherits( "QMenuBar" ) )		((QMenuBarHack *)(QWidget *)inFocus)->goodbye();	    if ( inFocus->hasFocus() ) {		if ( oldFocus && oldFocus->isVisible() && oldFocus->isEnabled() ) {		    oldFocus->setFocus();		} else {		    inFocus->clearFocus();		}	    }	}	inFocus = 0;	oldFocus = 0;    }}bool QPEMenuToolFocusManager::isActive() const{    return !inFocus.isNull();}void QPEMenuToolFocusManager::moveFocus( bool next ){    if ( !isActive() )	return;    int n = list.count();    QValueList<GuardedWidget>::Iterator it;    it = list.find( inFocus );    if ( it == list.end() )	it = list.begin();    while ( --n ) {	if ( next ) {	    ++it;	    if ( it == list.end() )		it = list.begin();	} else {	    if ( it == list.begin() )		it = list.end();	    --it;	}	QWidget *w = (*it);	if ( w && w->isEnabled() && w->isVisible() &&	     w->topLevelWidget() == qApp->activeWindow() &&	     !w->isA("QToolBarSeparator") ) {	    setFocus( w, next );	    return;	}    }}void QPEMenuToolFocusManager::initialize(){    if ( !me )	me = new QPEMenuToolFocusManager;}QPEMenuToolFocusManager *QPEMenuToolFocusManager::manager(){    if ( !me )	me = new QPEMenuToolFocusManager;    return me;}void QPEMenuToolFocusManager::setFocus( QWidget *w, bool next ){    inFocus = w;//    qDebug( "Set focus on %s", w->className() );    if ( inFocus->inherits( "QMenuBar" ) ) {	QMenuBar *mb = (QMenuBar *)(QWidget *)inFocus;	if ( next )	    mb->activateItemAt( 0 );	else	    mb->activateItemAt( mb->count()-1 );    }    inFocus->setFocus();}bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event ){    if ( event->type() == QEvent::KeyPress ) {	QKeyEvent *ke = (QKeyEvent *)event;	if ( isActive() ) {	    if ( object->inherits( "QButton" ) ) {		switch ( ke->key() ) {		    case Key_Left:			moveFocus( FALSE );			return TRUE;		    case Key_Right:			moveFocus( TRUE );			return TRUE;		    case Key_Up:		    case Key_Down:			return TRUE;		}	    } else if ( object->inherits( "QPopupMenu" ) ) {		// Deactivate when a menu item is selected		if ( ke->key() == Key_Enter || ke->key() == Key_Return ||		     ke->key() == Key_Escape ) {		    QTimer::singleShot( 0, this, SLOT(deactivate()) );		}	    } else if ( object->inherits( "QMenuBar" ) ) {		int dx = 0;		switch ( ke->key() ) {		    case Key_Left:			dx = -1;			break;		    case Key_Right:			dx = 1;			break;		}		QMenuBarHack *mb = (QMenuBarHack *)object;		if ( dx && mb->activeItem() >= 0 ) {		    int i = mb->activeItem();		    int c = mb->count();		    int n = c;		    while ( n-- ) {			i = i + dx;			if ( i == c ) {			    mb->goodbye();			    moveFocus( TRUE );			    return TRUE;			} else if ( i < 0 ) {			    mb->goodbye();			    moveFocus( FALSE );			    return TRUE;			}			QMenuItem *mi = mb->findItem( mb->idAt(i) );			if ( mi->isEnabled() && !mi->isSeparator() ) {			    break;			}		    }		}	    }	}	if ( ke->key() == Key_F11 ) {	    setActive( !isActive() );	    return TRUE;	}    } else if ( event->type() == QEvent::ChildInserted ) {	QChildEvent *ce = (QChildEvent *)event;	if ( ce->child()->isWidgetType() ) {	    if ( ce->child()->inherits( "QMenuBar" ) ) {		addWidget( (QWidget *)ce->child() );		ce->child()->installEventFilter( this );	    } else if ( object->inherits( "QToolBar" ) ) {		addWidget( (QWidget *)ce->child() );	    }	}    } else if ( event->type() == QEvent::ChildRemoved ) {	QChildEvent *ce = (QChildEvent *)event;	if ( ce->child()->isWidgetType() ) {	    if ( ce->child()->inherits( "QMenuBar" ) ) {		removeWidget( (QWidget *)ce->child() );		ce->child()->removeEventFilter( this );	    } else if ( object->inherits( "QToolBar" ) ) {		removeWidget( (QWidget *)ce->child() );	    }	}    } else if ( isActive() ) {	if ( event->type() == QEvent::KeyRelease ) {	    QKeyEvent *ke = (QKeyEvent *)event;	    if ( object->inherits( "QButton" ) ) {		// Deactivate when a button is selected		if ( ke->key() == Key_Space )		    QTimer::singleShot( 0, this, SLOT(deactivate()) );	    }	} else if ( event->type() == QEvent::FocusIn ) {	    // A non-menu/tool widget has been selected - we're deactivated	    QWidget *w = (QWidget *)object;	    if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) {		inFocus = 0;	    }	} else if ( event->type() == QEvent::Hide ) {	    // Deaticvate if a menu/tool has been hidden	    QWidget *w = (QWidget *)object;	    if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) {		setActive( FALSE );	    }	}    }    return FALSE;}void QPEMenuToolFocusManager::deactivate(){    setActive( FALSE );}/*!  \class QPEMenuBar qpemenubar.h  \brief The QPEMenuBar class is obsolete.  Use QMenuBar instead.  \obsolete  This class is obsolete.  Use QMenuBar instead.*//*!  Constructs a QPEMenuBar just as you would construct  a QMenuBar, passing \a parent and \a name.*/QPEMenuBar::QPEMenuBar( QWidget *parent, const char *name )    : QMenuBar( parent, name ){}/*!  \reimp*/QPEMenuBar::~QPEMenuBar(){}/*!  \internal*/void QPEMenuBar::keyPressEvent( QKeyEvent *e ){    QMenuBar::keyPressEvent( e );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -