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

📄 qtabwidget.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qtabwidget.h"#ifndef QT_NO_TABWIDGET#include "private/qwidget_p.h"#include "qapplication.h"#include "qbitmap.h"#include "qdesktopwidget.h"#include "qevent.h"#include "qlayout.h"#include "qstackedwidget.h"#include "qstyle.h"#include "qstyleoption.h"#include "qstylepainter.h"#include "qtabbar.h"#include "qtoolbutton.h"/*!    \class QTabWidget qtabwidget.h    \brief The QTabWidget class provides a stack of tabbed widgets.    \ingroup organizers    \ingroup advanced    \mainclass    A tab widget provides a tab bar (see QTabBar) and a "page area"    that is used to display pages related to each tab. By default, the    tab bar is shown above the page area, but different configurations    are available (see \l{TabPosition}). Each tab is associated with a    different widget (called a page). Only the current page is shown in    the page area; all the other pages are hidden. The user can show a    different page by clicking on its tab or by pressing its    Alt+\e{letter} shortcut if it has one.    The normal way to use QTabWidget is to do the following:    \list 1    \i Create a QTabWidget.    \i Create a QWidget for each of the pages in the tab dialog, but       do not specify a parent widget - the tab widget will reparent       the page widget later.    \i Insert children into the page widget, set up geometry management    for it and use addTab() (or insertTab()) to set up a tab with an    optional keyboard shortcut.    \i Connect to the signals and slots.    \endlist    The position of the tabs is defined by \l tabPosition, their shape    by \l tabShape.    The signal currentChanged() is emitted when the user selects a    page.    The current page index is available as currentIndex(), the current    page widget with currentWidget().  You can retrieve a pointer to a    page widget with a given index using widget(), and can find the    index position of a widget with indexOf(). Use setCurrentWidget()    or setCurrentIndex() to show a particular page.    You can change a tab's text and icon using setTabText() or    setTabIcon(). A tab can be removed with removeTab().    Each tab is either enabled or disabled at any given time (see    setTabEnabled()). If a tab is enabled, the tab text is drawn    normally and the user can select that tab. If it is disabled, the    tab is drawn in a different way and the user cannot select that    tab. Note that even if a tab is disabled, the page can still be    visible, for example if all of the tabs happen to be disabled.    Tab widgets can be a very good way to split up a complex dialog.    An alternative is to use a QStackedWidget for which you provide some    means of navigating between pages, for example, a QToolBar or a    QListWidget.    Most of the functionality in QTabWidget is provided by a QTabBar    (at the top, providing the tabs) and a QStackedWidget (most of the    area, organizing the individual pages).    \table 100%    \row \o \inlineimage windowsxp-tabwidget.png Screenshot of a Windows XP style tab widget         \o \inlineimage macintosh-tabwidget.png Screenshot of a Macintosh style tab widget         \o \inlineimage plastique-tabwidget.png Screenshot of a Plastique style tab widget    \row \o A Windows XP style tab widget.         \o A Macintosh style tab widget.         \o A Plastique style tab widget.    \endtable    \sa QTabBar QStackedWidget QToolBox*//*!    \enum QTabWidget::TabPosition    This enum type defines where QTabWidget draws the tab row:    \value North  The tabs are drawn above the pages.    \value South  The tabs are drawn below the pages.    \value West  The tabs are drawn to the left of the pages.    \value East  The tabs are drawn to the right of the pages.    \omitvalue Bottom    \omitvalue Top*//*!    \enum QTabWidget::TabShape    This enum type defines the shape of the tabs:    \value Rounded  rounded look (normal)    \value Triangular  triangular look*//* 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(int index);    This signal is emitted whenever the current page index changes.    The parameter is the new current page \a index position.    \sa currentWidget() currentIndex*/class QTabWidgetPrivate : public QWidgetPrivate{    Q_DECLARE_PUBLIC(QTabWidget)public:    QTabWidgetPrivate();    ~QTabWidgetPrivate();    void updateTabBarPosition();    void _q_showTab(int);    void _q_removeTab(int);    void init();    QStyleOptionTabWidgetFrame getStyleOption() const;    QTabBar *tabs;    QStackedWidget *stack;    QRect panelRect;    bool dirty;    QTabWidget::TabPosition pos;    QTabWidget::TabShape shape;    int alignment;    QWidget *leftCornerWidget;    QWidget *rightCornerWidget;};QTabWidgetPrivate::QTabWidgetPrivate()    : tabs(0), stack(0), dirty(true),      pos(QTabWidget::North), shape(QTabWidget::Rounded),      leftCornerWidget(0), rightCornerWidget(0){}QTabWidgetPrivate::~QTabWidgetPrivate(){}void QTabWidgetPrivate::init(){    Q_Q(QTabWidget);    stack = new QStackedWidget(q);    stack->setLineWidth(0);    QObject::connect(stack, SIGNAL(widgetRemoved(int)), q, SLOT(_q_removeTab(int)));    QTabBar *tabBar = new QTabBar(q);    tabBar->setDrawBase(false);    q->setTabBar(tabBar);#ifdef Q_OS_TEMP    pos = QTabWidget::South;#endif    q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    q->setFocusPolicy(Qt::TabFocus);    q->setFocusProxy(tabs);}QStyleOptionTabWidgetFrame QTabWidgetPrivate::getStyleOption() const{    Q_Q(const QTabWidget);    QStyleOptionTabWidgetFrame option;    option.init(q);    int exth = q->style()->pixelMetric(QStyle::PM_TabBarBaseHeight, 0, q);    QSize t(0, stack->frameWidth());    if (tabs->isVisibleTo(const_cast<QTabWidget *>(q)))        t = tabs->sizeHint();    if (rightCornerWidget)        option.rightCornerWidgetSize            = rightCornerWidget->sizeHint().boundedTo(t - QSize(exth, exth));    else        option.rightCornerWidgetSize = QSize(0, 0);    if (leftCornerWidget)        option.leftCornerWidgetSize            = leftCornerWidget->sizeHint().boundedTo(t - QSize(exth, exth));    else        option.leftCornerWidgetSize = QSize(0, 0);    switch (pos) {    case QTabWidget::North:        option.shape = shape == QTabWidget::Rounded ? QTabBar::RoundedNorth : QTabBar::TriangularNorth;        break;    case QTabWidget::South:        option.shape = shape == QTabWidget::Rounded ? QTabBar::RoundedSouth : QTabBar::TriangularSouth;        break;    case QTabWidget::West:        option.shape = shape == QTabWidget::Rounded ? QTabBar::RoundedWest : QTabBar::TriangularWest;        break;    case QTabWidget::East:        option.shape = shape == QTabWidget::Rounded ? QTabBar::RoundedEast : QTabBar::TriangularEast;        break;    }    option.tabBarSize = t;    return option;}/*!    Constructs a tabbed widget with parent \a parent.*/QTabWidget::QTabWidget(QWidget *parent)    : QWidget(*new QTabWidgetPrivate, parent, 0){    Q_D(QTabWidget);    d->init();}#ifdef QT3_SUPPORT/*!    Use one of the constructors that doesn't take the \a name    argument and then use setObjectName() instead.*/QTabWidget::QTabWidget(QWidget *parent, const char *name, Qt::WFlags f)    : QWidget(*new QTabWidgetPrivate, parent, f){    Q_D(QTabWidget);    setObjectName(QString::fromAscii(name));    d->init();}#endif/*!    Destroys the tabbed widget.*/QTabWidget::~QTabWidget(){}/*!    Adds another tab and page to the tab view.    The new page is \a child; the tab's label is \a label.    If the tab's \a label contains an ampersand, the letter following    the ampersand is used as a shortcut for the tab, e.g. if the    label is "Bro\&wse" then Alt+W becomes a shortcut which will    move the focus to this tab.    \sa insertTab()*/int QTabWidget::addTab(QWidget *child, const QString &label){    return insertTab(-1, child, label);}/*!    \overload    Adds another tab and page to the tab view.    This function is the same as addTab(), but with an additional \a    icon.*/int QTabWidget::addTab(QWidget *child, const QIcon& icon, const QString &label){    return insertTab(-1, child, icon, label);}/*!    Inserts another tab and page to the tab view.    The new page is \a w; the tab's label is \a label. Note the    difference between the widget name (which you supply to widget    constructors and to setTabEnabled(), for example) and the tab    label. The name is internal to the program and invariant, whereas    the label is shown on-screen and may vary according to language    and other factors.    If the tab's \a label contains an ampersand, the letter following    the ampersand is used as a shortcut for the tab, e.g. if the    label is "Bro\&wse" then Alt+W becomes a shortcut which will    move the focus to this tab.    If \a index is out of range, the tab is simply appended.    Otherwise it is inserted at the specified position.    If the QTabWidget was empty before this function is called,    \a w becomes the current page.    Inserting a new tab at an index less than or equal to the current index    will increment the current index, but keep the current page.    If you call insertTab() after show(), the screen will flicker and    the user may be confused.    \sa addTab()*/int QTabWidget::insertTab(int index, QWidget *w, const QString &label){    return insertTab(index, w, QIcon(), label);}/*!    \overload    Inserts another tab and page to the tab view.    This function is the same as insertTab(), but with an additional    \a icon.*/int QTabWidget::insertTab(int index, QWidget *w, const QIcon& icon, const QString &label){    Q_D(QTabWidget);    if(!w)        return -1;    index = d->tabs->insertTab(index, icon, label);    d->stack->insertWidget(index, w);    setUpLayout();    tabInserted(index);    return index;}/*!    Defines a new \a label for the page at position \a index's tab.*/void QTabWidget::setTabText(int index, const QString &label){    Q_D(QTabWidget);    d->tabs->setTabText(index, label);    setUpLayout();}/*!    Returns the label text for the tab on the page at position \a index.*/QString QTabWidget::tabText(int index) const{    Q_D(const QTabWidget);    return d->tabs->tabText(index);}/*!    \overload    Sets the \a icon for the tab at position \a index.*/void QTabWidget::setTabIcon(int index, const QIcon &icon){    Q_D(QTabWidget);    d->tabs->setTabIcon(index, icon);    setUpLayout();}/*!    Returns the label text for the tab on the page at position \a index.*/QIcon QTabWidget::tabIcon(int index) const{    Q_D(const QTabWidget);    return d->tabs->tabIcon(index);}/*!    Returns true if the the page at position \a index is enabled; otherwise returns false.    \sa setTabEnabled(), QWidget::isEnabled()*/bool QTabWidget::isTabEnabled(int index) const{    Q_D(const QTabWidget);    return d->tabs->isTabEnabled(index);}/*!    If \a enable is true, the page at position \a index is enabled; otherwise the page at position \a index is    disabled. The page's tab is redrawn appropriately.    QTabWidget uses QWidget::setEnabled() internally, rather than    keeping a separate flag.    Note that even a disabled tab/page may be visible. If the page is    visible already, QTabWidget will not hide it; if all the pages are    disabled, QTabWidget will show one of them.    \sa isTabEnabled(), QWidget::setEnabled()*/void QTabWidget::setTabEnabled(int index, bool enable){    Q_D(QTabWidget);    d->tabs->setTabEnabled(index, enable);}/*!  \fn void QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner)  Sets the given \a widget to be shown in the specified \a corner of the  tab widget.  Only the horizontal element of the \a corner will be used.  \sa cornerWidget(), setTabPosition()*/void QTabWidget::setCornerWidget(QWidget * w, Qt::Corner corner){    Q_D(QTabWidget);    if (!w)        return;    if ((uint)corner & 1)        d->rightCornerWidget = w;    else        d->leftCornerWidget = w;}/*!    Returns the widget shown in the \a corner of the tab widget or 0.*/QWidget * QTabWidget::cornerWidget(Qt::Corner corner) const{    Q_D(const QTabWidget);    if ((uint)corner & 1)        return d->rightCornerWidget;    return d->leftCornerWidget;}/*!   Removes the page at position \a index from this stack of   widgets. Does not delete the page widget.*/void QTabWidget::removeTab(int index){    Q_D(QTabWidget);    if (QWidget *w = d->stack->widget(index))        d->stack->removeWidget(w);}/*!    Returns a pointer to the page currently being displayed by the tab    dialog. The tab dialog does its best to make sure that this value    is never 0 (but if you try hard enough, it can be).    \sa currentIndex(), setCurrentWidget()*/QWidget * QTabWidget::currentWidget() const{    Q_D(const QTabWidget);    return d->stack->currentWidget();}/*!    Makes \a widget the current widget. The \a widget used must be a page in    this tab widget.    \sa addTab(), setCurrentIndex(), currentWidget() */void QTabWidget::setCurrentWidget(QWidget *widget){    Q_D(const QTabWidget);    d->tabs->setCurrentIndex(indexOf(widget));}/*!    \property QTabWidget::currentIndex    \brief the index position of the current tab page*/int QTabWidget::currentIndex() const{    Q_D(const QTabWidget);    return d->tabs->currentIndex();}void QTabWidget::setCurrentIndex(int index){    Q_D(QTabWidget);    d->tabs->setCurrentIndex(index);}/*!    Returns the index position of the page occupied by the widget \a    w, or -1 if the widget cannot be found.*/int QTabWidget::indexOf(QWidget* w) const{    Q_D(const QTabWidget);    return d->stack->indexOf(w);}/*!    \reimp*/void QTabWidget::resizeEvent(QResizeEvent *e){    QWidget::resizeEvent(e);    setUpLayout();}/*!    Replaces the dialog's QTabBar heading with the tab bar \a tb. Note    that this must be called \e before any tabs have been added, or

⌨️ 快捷键说明

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