?? qtabwidget.cpp
字號(hào):
/****************************************************************************** $Id: qt/src/widgets/qtabwidget.cpp 2.3.12 edited 2005-10-27 $**** Implementation of QTabWidget class**** Created : 990318**** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.**** This file is part of the widgets module of the Qt GUI Toolkit.**** This file may be distributed under the terms of the Q Public License** as defined by Trolltech AS of Norway and appearing in the file** LICENSE.QPL included in the packaging of this file.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition** licenses may use this file in accordance with the Qt Commercial License** Agreement provided with the Software.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for** information about Qt Commercial License Agreements.** See http://www.trolltech.com/qpl/ for QPL licensing information.** 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.************************************************************************/#include "qtabwidget.h"#ifndef QT_NO_TABWIDGET#include "qobjectlist.h"#include "qobjectdict.h"#include "qtabbar.h"#include "qapplication.h"#include "qwidgetstack.h"#include "qbitmap.h"#ifdef QT_KEYPAD_MODEextern bool qt_modalEditingEnabled;#endif// NOT REVISED/*! \class QTabWidget qtabwidget.h \brief The QTabWidget class provides a stack of tabbed widgets. \ingroup organizers A tabbed widget is one in which several "pages" are available, and the user selects which page to see and use by clicking on its tab, or by pressing the indicated Alt-(letter) key combination. QTabWidget does not provide more than one row of tabs, and does not provide tabs along the sides or bottom of the pages. The normal way to use QTabWidget is to do the following in the constructor: <ol> <li> Create a QTabWidget. <li> Create a QWidget for each of the pages in the tab dialog, insert children into it, set up geometry management for it, and use addTab() to set up a tab and keyboard accelerator for it. <li> Connect to the signals and slots. </ol> If you don't call addTab(), the page you have created will not be visible. Please don't confuse the object name you supply to the QWidget constructor and the tab label you supply to addTab(): addTab() takes a name which indicates an accelerator and is meaningful and descriptive to the user, while the widget name is used primarily for debugging. A signal currentChanged() is emitted when the user selects some page. Each tab is either enabled or disabled at any given time. If a tab is enabled, the tab text is drawn in black and the user can select that tab. If it is disabled, the tab is drawn in a different way and the user can not select that tab. Note that even though a tab is disabled, the page can still be visible, for example if all of the tabs happen to be disabled. While tab widgets can be a very good way to split up a complex dialog, it's also very easy to make a royal mess out of it. See QTabDialog for some design hints. Most of the functionality in QTabWidget is provided by a QTabBar (at the top, providing the tabs) and a QWidgetStack (most of the area, organizing the individual pages). <img src=qtabwidget-m.png> <img src=qtabwidget-w.png> \sa QTabDialog*//*! \enum QTabWidget::TabPosition This enum type defines where QTabWidget can draw the tab row: <ul> <li> \c Top - above the pages <li> \c Bottom - below the pages </ul>*//*! \enum QTabWidget::TabShape This enum type defines the shape of the tabs: <ul> <li> \c Rounded - rounded look (normal) <li> \c Triangular - triangular look (very unusual, included for completeness) </ul>*//* undocumented now \obsolete \fn void QTabWidget::selected( const QString &tabLabel ); This signal is emitted whenever a tab is selected (raised), including during the first show(). \sa raise()*//*! \fn void QTabWidget::currentChanged( QWidget* ); This signal is emitted whenever the current page changes. \sa currentPage(), showPage(), tabLabel()*/class QTabWidgetData{public: QTabWidgetData() : tabs(0), stack(0), dirty( TRUE ), pos( QTabWidget::Top ), shape( QTabWidget::Rounded ) {}; ~QTabWidgetData(){}; QTabBar* tabs; QWidgetStack* stack; bool dirty; QTabWidget::TabPosition pos; QTabWidget::TabShape shape;};/*! Constructs a tabbed widget with parent \a parent, name \a name and widget flags \a f.*/QTabWidget::QTabWidget( QWidget *parent, const char *name, WFlags f ) : QWidget( parent, name, f ){ init();}/*! \overload*/QTabWidget::QTabWidget( QWidget *parent, const char *name ) : QWidget( parent, name ){ init();}void QTabWidget::init(){ d = new QTabWidgetData; d->stack = new QWidgetStack( this, "tab pages" ); d->stack->installEventFilter( this ); setTabBar( new QTabBar( this, "tab control" ) ); d->stack->setFrameStyle( QFrame::StyledPanel | QFrame::Raised ); d->stack->setLineWidth( style().defaultFrameWidth() ); setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); setFocusPolicy( TabFocus ); setFocusProxy( d->tabs );}/*! Destructs the tab widget.*/QTabWidget::~QTabWidget(){ delete d;}/*! Adds another tab and page to the tab view. The tab will be labelled \a label and \a child constitutes the new page. Note the difference between the widget name (which you supply to widget constructors and to e.g. setTabEnabled()) and the tab label: The name is internal to the program and invariant, while the label is shown on screen and may vary according to e.g. language. \a label is written in the QButton style, where &P makes Qt create an accelerator key on Alt-P for this page. For example: \code td->addTab( graphicsPane, "&Graphics" ); td->addTab( soundPane, "&Sound" ); \endcode If the user presses Alt-S the sound page of the tab dialog is shown, if the user presses Alt-P the graphics page is shown. If you call addTab() after show(), the screen will flicker and the user will be confused.*/void QTabWidget::addTab( QWidget *child, const QString &label){ QTab * t = new QTab(); CHECK_PTR( t ); t->label = label; addTab( child, t );}/*! Adds another tab and page to the tab view. This function is the same as addTab() but with an additional iconset. */void QTabWidget::addTab( QWidget *child, const QIconSet& iconset, const QString &label){ QTab * t = new QTab(); CHECK_PTR( t ); t->label = label; t->iconset = new QIconSet( iconset ); addTab( child, t );}/*! This is a lower-level method for adding tabs, similar to the other addTab() method. It is useful if you are using setTabBar() to set a QTabBar subclass with an overridden QTabBar::paint() routine for a subclass of QTab.*/void QTabWidget::addTab( QWidget *child, QTab* tab){ tab->enabled = TRUE; int id = d->tabs->addTab( tab ); d->stack->addWidget( child, id ); if ( d->stack->frameStyle() != ( QFrame::StyledPanel | QFrame::Raised ) ) d->stack->setFrameStyle( QFrame::StyledPanel | QFrame::Raised ); setUpLayout();}/*! Inserts another tab and page to the tab view. The tab will be labelled \a label and \a child constitutes the new page. Note the difference between the widget name (which you supply to widget constructors and to e.g. setTabEnabled()) and the tab label: The name is internal to the program and invariant, while the label is shown on screen and may vary according to e.g. language. \a label is written in the QButton style, where &P makes Qt create an accelerator key on Alt-P for this page. For example: \code td->insertTab( graphicsPane, "&Graphics" ); td->insertTab( soundPane, "&Sound" ); \endcode If \a index is not specified, the tab is simply added. Otherwise it's inserted at the specified position. If the user presses Alt-S the sound page of the tab dialog is shown, if the user presses Alt-P the graphics page is shown. If you call insertTab() after show(), the screen will flicker and the user will be confused.*/void QTabWidget::insertTab( QWidget *child, const QString &label, int index){ QTab * t = new QTab(); CHECK_PTR( t ); t->label = label; insertTab( child, t, index );}/*! Inserts another tab and page to the tab view. This function is the same as insertTab() but with an additional iconset. */void QTabWidget::insertTab( QWidget *child, const QIconSet& iconset, const QString &label, int index ){ QTab * t = new QTab(); CHECK_PTR( t ); t->label = label; t->iconset = new QIconSet( iconset ); insertTab( child, t, index );}/*! This is a lower-level method for inserting tabs, similar to the other insertTab() method. It is useful if you are using setTabBar() to set a QTabBar subclass with an overridden QTabBar::paint() routine for a subclass of QTab.*/void QTabWidget::insertTab( QWidget *child, QTab* tab, int index){ tab->enabled = TRUE; int id = d->tabs->insertTab( tab, index ); d->stack->addWidget( child, id ); if ( d->stack->frameStyle() != ( QFrame::StyledPanel | QFrame::Raised ) ) d->stack->setFrameStyle( QFrame::StyledPanel | QFrame::Raised ); setUpLayout();}/*! Defines a new label for the tab of page \a w */void QTabWidget::changeTab( QWidget *w, const QString &label){ //#### accelerators int id = d->stack->id( w ); if ( id < 0 ) return; QTab* t = d->tabs->tab( id ); if ( !t ) return; t->label = label; d->tabs->layoutTabs(); int ct = d->tabs->currentTab(); bool block = d->tabs->signalsBlocked(); d->tabs->blockSignals( TRUE ); d->tabs->setCurrentTab( 0 ); d->tabs->setCurrentTab( ct ); d->tabs->blockSignals( block ); d->tabs->update(); setUpLayout();}/*! Defines a new \a iconset and a new \a label for the tab of page \a w */void QTabWidget::changeTab( QWidget *w, const QIconSet& iconset, const QString &label){ //#### accelerators int id = d->stack->id( w ); if ( id < 0 ) return; QTab* t = d->tabs->tab( id ); if ( !t ) return; if ( t->iconset ) delete t->iconset; t->label = label; t->iconset = new QIconSet( iconset ); d->tabs->layoutTabs(); int ct = d->tabs->currentTab(); bool block = d->tabs->signalsBlocked(); d->tabs->blockSignals( TRUE ); d->tabs->setCurrentTab( 0 ); d->tabs->setCurrentTab( ct ); d->tabs->blockSignals( block ); d->tabs->update(); setUpLayout();}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -