QT6 源,七章对话框与多窗体(13)选项卡窗体 QTabWidget 篇二:本标签窗体的源代码,带注释

(8)本源代码定义于头文件 qtabwidget . h

#ifndef QTABWIDGET_H
#define QTABWIDGET_H

#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qwidget.h>
#include <QtGui/qicon.h>

QT_REQUIRE_CONFIG(tabwidget);

QT_BEGIN_NAMESPACE

class QTabBar;
class QTabWidgetPrivate;
class QStyleOptionTabWidgetFrame;

/*
The QTabWidget class provides a stack of tabbed widgets.

Detailed Description :
-个选项卡组件提供选项卡栏(见 QTabBar)和一个“页面区域”,用于显示与每个选项卡相关的页面。
默认情况下,选项卡栏位于页面区域上方,但可以采用不同的配置(见TabPosition)。
每个选项卡都与一个不同的组件(称为页面)相关联。只有当前页面会显示在页面区域中;所有其他页面都会被隐藏。
用户可以通过点击相应选项卡的标签或按下其存在的 Alt+字母快捷键 来显示不同的页面。

使用QTabWidget的正常方式是执行以下操作:
    1.创建一个QTabWidget。
    2.为标签对话框中的每个页面创建一个QWidget,但不要为其指定父级Widget。
    3.使用布局将子小部件插入页面小部件中,使其正常定位。
    4.调用addTab()或insertTab()将页面小部件放入标签页小部件中,
        为每个标签页提供一个合适的标签,并可选地设置键盘快捷键。

标签的位置由tabPosition定义,形状由tabShape定义。当用户选择页面时,会触发currentChanged()信号。
当前页面索引可通过`currentIndex()、函数获取,当前页面小部件则可通过`currentWidget()'函数获得。
您可以使用`widget()函数获取具有指定索引的页面小部件的指针,
并通过indexOf()函数找到具有特定索引的小部件的位置。
使用`setCurrentWidget()或setCurrentIndex()函数可显示特定的页面。
你可以使用setTabText()或setTabIcon()来更改标签页的文本和图标。
可以使用removeTab()移除标签页及其关联页面。

每个选项卡在任何给定时间都可以被启用或禁用(参见setTabEnabled()方法)。
如果选项卡被启用,那么其标签文本将正常显示,用户也可以选择该选项卡。
如果选项卡被禁用,那么其显示方式会有所不同,用户无法选择该选项卡。
请注意,即使选项卡被禁用,页面仍然可以是可见的,例如,当所有选项卡都被禁用时。

标签小部件可以是划分复杂对话框的极好方式。
另一个选择是使用QStackedWidget,并为它提供一些在页面之间导航的手段,例如QToolBar或QListWidget。

QTabWidget的大部分功能由QTabBar(位于顶部,提供选项卡)和
QStackedWidget(占据大部分区域,用于组织各个页面)提供。

*/

class Q_WIDGETS_EXPORT QTabWidget : public QWidget
{
    Q_OBJECT

    //enum TabPosition { North, South, West, East }; 默认情况下,此属性设置为North。即上边
    //此属性用于设置此标签页控件中各个标签的位置。此属性的可能值由TabPosition枚举描述。
    Q_PROPERTY(TabPosition tabPosition READ tabPosition WRITE setTabPosition)

    //enum TabShape { Rounded, Triangular };
    //此属性用于设置此标签页控件中标签的形状。
    //此属性的可能值为QTabWidget::Rounded(默认)或QTabWidget::Triangular。
    Q_PROPERTY(TabShape tabShape READ tabShape WRITE setTabShape)

    //此属性保存当前标签页的索引位置。如果没有当前小部件,则当前索引为-1。
    //默认情况下,此属性包含值-1,因为最初在小部件中没有标签。
    Q_PROPERTY(int       currentIndex   READ     currentIndex
                WRITE setCurrentIndex   NOTIFY   currentChanged  )

    //此属性表示标签栏中的标签数量。 默认情况下,此属性包含值为0。
    Q_PROPERTY(int count READ count)

    //此属性用于设置标签栏中图标的大小。
    //默认值取决于样式。这是图标将拥有的最大尺寸。如果图标是较小的尺寸,则不会放大。
    Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize)

    //如何在标签栏中省略文本。此属性控制在给定标签栏大小下没有足够空间显示项目时如何进行裁剪。
    //该属性统一设置的是所有标签的省略号。其值对所有的标签都有效。
    Q_PROPERTY(Qt::TextElideMode   elideMode   // 默认情况下,该值依赖于样式。
                READ               elideMode   WRITE   setElideMode)
    /*
    //This enum specifies where the ellipsis should appear
    //  when displaying texts that don't fit:
    //此枚举指定在显示不匹配文本时,句号应出现在何处: 。在模型与视图架构的条目显示时,会用到本类
    enum TextElideMode {  //  Elide  省略;忽略
        ElideLeft  , //The ellipsis should appear at the beginning of the text。
        ElideRight , //The ellipsis should appear at the end       of the text.
        ElideMiddle, //The ellipsis should appear in the middle    of the text.
        ElideNone    //Ellipsis should NOT appear in the text.
    };
    */


    //此属性决定当标签栏有太多标签时,是否应使用按钮来滚动标签。
    //当选项卡栏因容纳的选项卡过多而显得过于拥挤时,
    //该选项卡栏可以选择扩大其尺寸,或者添加按钮以方便用户通过选项卡进行滚动浏览。
    Q_PROPERTY(bool  usesScrollButtons //默认情况下,该值依赖于样式。
                READ usesScrollButtons WRITE setUsesScrollButtons)

    //此属性表示标签页小部件是否以适合文档页面的方式渲染。这与macOs上的文档模式相同。
    //当设置此属性时,选项卡小部件框架将不会渲染。 //文档模式好像就是背景色透明而已。
    //这种模式适用于那些页面占据大部分选项卡小部件区域的文档类型页面。
    Q_PROPERTY(bool documentMode READ documentMode WRITE setDocumentMode)

    //此属性表示是否自动为每个标签页添加关闭按钮。此按钮只是显示,并没有关闭的功能。
    Q_PROPERTY(bool tabsClosable READ tabsClosable WRITE setTabsClosable)

    //此属性表示用户是否可以在标签栏区域内移动标签页。默认情况下,此属性为false;
    Q_PROPERTY(bool movable READ isMovable WRITE setMovable)

    //如果为真,当标签栏包含少于2个标签时,将自动隐藏。 默认情况下,此属性为false。
    //意思是当只有一个选项卡时候,还是否要显示标签。
    Q_PROPERTY(bool tabBarAutoHide READ tabBarAutoHide WRITE setTabBarAutoHide)

private:
    Q_DECLARE_PRIVATE(QTabWidget)
    Q_DISABLE_COPY(QTabWidget)
    Q_PRIVATE_SLOT(d_func(), void _q_showTab(int))
    Q_PRIVATE_SLOT(d_func(), void _q_removeTab(int))
    Q_PRIVATE_SLOT(d_func(), void _q_tabMoved(int, int))
    void setUpLayout(bool = false);

public:
    //Constructs a tabbed widget with parent parent.
    explicit QTabWidget(QWidget * parent = nullptr);

    ~QTabWidget();

    enum TabPosition { North, South, West, East };
    Q_ENUM(TabPosition)
//   Q_PROPERTY(TabPosition     tabPosition    //此属性用于设置此标签页控件中各个标签的位置。
//              READ            tabPosition    WRITE    setTabPosition)
                TabPosition     tabPosition() const;
                void         setTabPosition(TabPosition position);

    enum TabShape {
        Rounded,    //标签以圆角外观绘制。这是默认形状。
        Triangular  //标签以三角形的外观绘制。
    };
    Q_ENUM(TabShape)
//   Q_PROPERTY(TabShape        tabShape       //此属性用于设置此标签页控件中标签的形状。
//              READ            tabShape       WRITE    setTabShape)
                TabShape        tabShape() const;
                void         setTabShape(TabShape s);


//   Q_PROPERTY(int       currentIndex   READ     currentIndex //当前标签页的索引,默认-1
//              WRITE  setCurrentIndex   NOTIFY   currentChanged  )
                int       currentIndex  () const;
                QWidget * currentWidget () const;
public Q_SLOTS:
                void   setCurrentIndex  (int       index);
                void   setCurrentWidget (QWidget * widget);
Q_SIGNALS:
                void      currentChanged(int       index);

public:
//   Q_PROPERTY(int    count    READ    count) //标签窗体中的页数量。 默认为0。
                int    count() const;

//   Q_PROPERTY(QSize     iconSize    /此属性用于设置标签栏中图标的大小。
//              READ      iconSize    WRITE setIconSize)
                QSize     iconSize() const;
                void   setIconSize(const QSize & size);


// enum Qt::TextElideMode { ElideLeft, ElideRight, ElideMiddle, ElideNone };
//   Q_PROPERTY(Qt::TextElideMode      elideMode      //标签栏中省略号的位置。
//              READ                   elideMode      WRITE   setElideMode)
                Qt::TextElideMode      elideMode() const;
                void                setElideMode(Qt::TextElideMode mode);


//   Q_PROPERTY(bool      usesScrollButtons     //是否在标签栏添加滚动按钮。
//              READ      usesScrollButtons     WRITE   setUsesScrollButtons)
                bool      usesScrollButtons() const;
                void   setUsesScrollButtons(bool useButtons);

//   Q_PROPERTY(bool      documentMode          //是否以文档模式渲染,默认为 F
//              READ      documentMode          WRITE   setDocumentMode)
                bool      documentMode() const;
                void   setDocumentMode(bool set);


//   Q_PROPERTY(bool      tabsClosable          //是否自动为每个标签页添加关闭按钮,默认F
//              READ      tabsClosable          WRITE   setTabsClosable)
                bool      tabsClosable() const;
                void   setTabsClosable(bool closeable);


//   Q_PROPERTY(bool      movable               //表用户是否可以在标签栏区域内移动标签页,默认F
//              READ    isMovable               WRITE   setMovable)
                bool    isMovable() const;
                void   setMovable(bool movable);

//   Q_PROPERTY(bool      tabBarAutoHide        //意思是当只有一个选项卡时候,还是否要显示标签。
//              READ      tabBarAutoHide        WRITE   setTabBarAutoHide)
                bool      tabBarAutoHide() const;
                void   setTabBarAutoHide(bool enabled);


    QSize          sizeHint  ()          const override;
    QSize   minimumSizeHint  ()          const override;
    int        heightForWidth(int width) const override;
    bool    hasHeightForWidth()          const override;

    QString             tabText(int index) const; //返回指定索引处的标签文本
    void             setTabText(int index, const QString & text);
    //Defines a new text for the page at position index's tab.
    //如果提供的文本包含逗号字符('&'),则会自动为其创建快捷方式。“&”后面的字符将用作快捷键。
    //任何以前的快捷方式都将被覆盖,如果文本中没有定义任何快捷方式,则将被清除。
    //有关详细信息,请参阅QShortcut文档(要显示实际的逗号,请使用“&&”)。

    QIcon               tabIcon     (int index) const;
    void             setTabIcon     (int index, const QIcon   & icon);

    QString             tabToolTip  (int index) const;
    void             setTabToolTip  (int index, const QString & tip );
    //Sets the tab tool tip for the page at position index to tip.

    QString             tabWhatsThis(int index) const;
    void             setTabWhatsThis(int index, const QString & text);
    //Sets the What's This help text for the page at position index to text.

    bool              isTabVisible(int index) const;
    void             setTabVisible(int index, bool visible);
    //如果visible为true,则位置index的页面是可见的;否则,位置index的页面是隐藏的。页面的标签将适当重绘。

    bool              isTabEnabled(int index) const;
    void             setTabEnabled(int index, bool enabled);
    //如果enable为true,位置index的页面将被启用;否则该页面将被禁用。页面的标签页将适当重绘。
    //QTabWidget 内部使用 QWidget::setEnabled(),而不是保持一个单独的标志。
    //请注意,即使是被禁用的选项卡/页面也可能可见。如果页面已经可见,QTabWidget不会将其隐藏;
    //如果所有页面都被禁用,QTabWidget 会显示其中一个页面。

    //enum Qt::Corner { TopLeftCorner,TopRightCorner,BottomLeftCorner,BottomRightCorner };
    //Returns the widget shown in the corner of the tab widget or nullptr.返回角落里的窗体
    QWidget *    cornerWidget(             Qt::Corner corner = Qt::TopRightCorner) const;
    void      setCornerWidget(QWidget * w, Qt::Corner corner = Qt::TopRightCorner);
    //Sets the given widget to be shown in the specified corner of the tab widget.
    //小部件的几何形状是根据小部件的`sizeHint()和样式确定的。仅使用角落 corner的水平元素。
    //传递nullptr时,角落中不会显示任何小部件。任何先前设置的角落小部件都将被隐藏。
    //这里设置的所有小部件将在标签小部件被销毁时被一并删除,
    //  除非你在设置其他角部小部件(或`nullptr`)后单独重新设置小部件的父节点。
    //注意:角落小部件是为北向和南向标签位置设计的;其他方向已知无法正常工作。

    QWidget *  widget(int index) const;
    int       indexOf(const QWidget * widget) const;

    QTabBar *       tabBar() const; //Returns the current QTabBar.

    //Inserts a tab with the given label and widget into the tab widget at the
    //  specified index, 并返回插入的选项卡在选项卡栏中的索引。页面的所有权被传递给QTabWidget。
    //标签在标签中显示,并且其外观可能会根据标签小部件的配置而变化。
    //如果选项卡的标签包含“&”符号,那么紧随“&”符号之后的字母将被用作该选项卡的快捷键,
    //例如如果标签是“Bro&wse’,那么Alt+W将成为一个快捷键,将焦点移动到该选项卡上。
    //如果索引超出范围,标签页将被简单地追加。否则,它将在指定位置插入。
    //如果在调用此函数之前 QTabWidget 是空的,那么新页面将成为当前页面。
    //在索引小于或等于当前索引的位置插入一个新标签,将递增当前索引,但保持当前页面不变。
    //注:如果在调用`show()之后调用`insertTab(),布局系统将尝试调整其组件层次结构中的变化,
    //这可能会导致闪烁。为避免这种情况,
    //可以在进行更改之前将`QWidget::updatesEnabled属性设置为`false~; 这是 QWidget的成员函数
    //记得在更改完成时将该属性设置为`true`,以便使该组件重新接收绘制事件。
    int       insertTab(int index, QWidget * widget, const QString & label);

    int       insertTab(int index, QWidget * widget, //顺便给标签加个图标
                        const      QIcon   & icon,   const QString & label);

    //Adds a tab with the given page and label to the tab widget,
    //  and returns the index of the tab in the tab bar.
    //Ownership of page is passed on to the QTabWidget.
    int          addTab(QWidget * widget,                     const QString & label);
    int          addTab(QWidget * widget, const QIcon & icon, const QString & label);

    void      removeTab(int index);
    //从这个堆栈中移除位置 index处的标签页。页面组件本身不会被删除。

    void         clear(); //删除所有页面,但不删除它们。
    //调用此函数等同于调用removeTab()直到标签页为空。

Q_SIGNALS:
    //void currentChanged   (int index);
    //每当当前页面索引发生变化时,就会发出这个信号。
    //该参数是新当前页面索引位置,或者为-1表示没有新的索引(例如,如果QTabWidget中不存在任何小部件)。

    //当用户点击索引位置的标签时,会触发此信号。
    //索引指的是点击的标签页,或者在没有标签页的情况下返回-1。
    void tabBarClicked      (int index);
    void tabBarDoubleClicked(int index);
    //当用户在索引处双击标签时,会触发此信号。
    //索引是被点击标签页的索引,或者如果当前光标不在任何标签页下,则为-1。

    void tabCloseRequested  (int index);
    //当点击标签页上的关闭按钮时,会触发此信号。index是应被移除的页面索引。

protected:
    //This virtual handler is called after a
    //  new tab was added or inserted at position index.
    virtual void tabInserted(int index); //在新标签页被添加或插入到位置index后,会调用此虚函数。
    virtual void tabRemoved (int index);
    //This virtual handler is called after a tab was removed from position index.

    //请注意,这必须在添加任何选项卡之前调用,否则其行为将不明确。
    void setTabBar(QTabBar * tb); //用选项卡栏 tb 替换对话框的 QTabBar 标题。

    bool         event(QEvent       *) override;
    void     showEvent(QShowEvent   *) override;
    void   resizeEvent(QResizeEvent *) override;
    void keyPressEvent(QKeyEvent    *) override;
    void    paintEvent(QPaintEvent  *) override;
    void   changeEvent(QEvent       *) override;

    virtual void initStyleOption(QStyleOptionTabWidgetFrame * option) const;
    //使用此 QTabWidget 的值初始化形参 option。
    //该方法对于需要 QStyleOptionTabWidgetFrame 但不希望自行填充所有信息的子类非常有用。


}; //完结 class QTabWidget : public QWidget

QT_END_NAMESPACE

#endif // QTABWIDGET_H

(9)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值