• QTabWidget 类 (选项卡部件)


    1、 QTabWidget 类直接继承自 QWidget。该类提供了一个选项卡栏(QTabBar)一个相应的页
    面区域
    ,用于显示与每个选项卡相对应的页面。 与 QStackedLayout 布局原理相同,只有
    当前页面(即可见页面)是可见的,所有其他页面都不可见,用户可通过选择不同的选项卡

    来显示其对应的其他页面。
    2、页面或页面部件:其实就是容器(通常使用 QWidget 创建)
    3、 QTabWidget 类,是一个实现多页面切换的类,该类已经实现了多页面切换的部分功能,
    只需再对其进行少量的设计(主要是要设计页面中的内容)便可实现多页面切换了。 因此,
    使用该类实现多页面切换时,就不需要再使用 QStackedLayout 布局把页面与选项卡相关
    联,也不需要使用类似 QVBoxLayout 的布局把选项卡和页面放置在一起。
    4、 QTabWidget 类的大部分功能由 QTabBar(主要处理选项卡部分)和 QStackedWidget(主要处
    理组织页面的功能)提供。


    5、 使用 QTabWidget 的步骤为:
    ①、 创建一个 QTabWidget。
    ②、 为每个选项卡创建一个页面(容器),通常为 QWidget(不要指定父部件)。
    ③、 把子部件插入到页面部件(即容器)中。
    ④、 使用 addTab()或 insertTab()把页面部件放入选项卡部件。
    ⑤、下面为大致代码

    1. QTabWidget pt; //选项卡部件
    2. QWidget *pw, *pw1, *pw2….; //创建容器。
    3. ……….. //向容器中添加需要显示的内容,略。
    4. pt.addTab(pw,"AAA"); //把容器 pw 作为选项卡 AAA 的页面。
    5. pt.addTab(pw,"BBB"); //把容器 pw1 作为选项卡 BBB 的页面。
    6. …….


    ⑥、 注:若容器中的内容不可见,则使用 resize()函数设置 QTabWidget 的大小使其可见

    6、 QTabWidget 类中的属性和函数大多与 QTabBar 中的属性和函数是相同的,对于相同的属
    性和函数此处仅列出,只讲解不相同的属性和函数。

    7、 QTabWidget 类中的属性

    QTabWidget 类属性
    该表中的属于与 QTabBar 中的属性相同,请参阅 QTabBar 类的讲解
    属性名说明属性名说明
    count获取选项卡的数量documentMode是否以适合文档页面的模式呈现
    movable选项卡是否可移动currentIndex获取和设置当前选项卡
    elideMode选项卡中文本的省略方式tabsClosable是否显示选项卡上的关闭按钮
    iconSize选项卡栏中的图标大小usesScrollButtons是否使用滚动按钮

    ①、 tabBarAutoHide: bool //qt5.4
    访问函数: bool tabBarAutoHide(); void setTabBarAutoHide(bool);
    若为 true,则当选项卡只有 1 个时,会自动隐藏,默认为 false。该属性对应于 QTabBar
    的 autoHide 属性。
    ②、 tabPosition: TabPosition
    访问函数: TabPosition tabPosition()const; void setTabPosition(TabPosition);
    获取或设置选项卡的位置(即选项卡位于上、下、左、右)。默认为 North(即上)。

    TabPosition 枚举见下表

    QTabWidget::TabPosition 枚举(无标志)
    作用:描述选项卡的位置
    成员说明成员说明
    QTabWidget::North0北面(即上面)QTabWidget::West2西面(即左侧)
    QTabWidget::South1南面(即下面)QTabWidget::East3东面即右侧)

    ③、 tabShape: TabShape 访问函数: TabShape tabShape() const; void setTabShape(TabShape);
    此属性描述选项卡的形状,该属性对应于 QTabBar 的 shape 属性,其外观可参阅该类

    QTabWidget::TabShape 枚举(无标志)
    作用:描述选项卡的形状
    成员说明成员说明
    QTabWidget::Rounded0圆形外观(默认)QTabWidget::Triangular2三角形外观

    7、 QTabWidget 类中的函数
    ①、 QTabWidget(QWidget* parent = Q_NULLPTR); //构造函数
    ②、 int addTab(QWidget* page, const QString &label);
    int addTab(QWidget* page, const QIcon &icon, const QString &label);
    int insert(int index, QWidget* page, const QString &label);
    int insert(int index, QWidget* page, const QIcon &icon, const QString &label);
     以上函数表示,把页面部件 page 和具有文本 label 和(或)图标 icon 的选项卡添加
    到 QTabWidget 部件的末尾
    插入到索引 index 处,并返回选项卡栏上该选项卡的
    索引。
     其中 label 和 icon 会成为选项卡的文本和图标。
     可在 label 的文本中使用&符号为选项卡设置快捷键。
     若在小于或等于当前选项卡索引的索引处插入一个新选项卡,将使当前选项卡的
    索引号增加,但当前选项卡保持不变。
     若以上函数在 show()之后调用,则可能会导致闪烁现象。
    ③、 void clear();
    移除所有页面,但不删除它们。调用此函数相当于调用 removeTab()函数直到选项卡部
    件为空。
    ④、 void removeTab(int index); //移除索引 index 处的选项卡,页面不会被删除。

    ⑤、 int indexOf(QWidget* w) const; //返回部件 w 的索引位置,若没有该部件则返回-1
    ⑥、 QWidget* widget(int index) const; //返回索引 index 处的页面部件。
    ⑦、 QWidget* currentWidget() const; //返回指向当前页面部件的指针。

    void setCurrentWidget(QWidget* widget);//槽,把 widget 设置为当前页面(可见页面)。

    ⑧、 QTabBar* tabBar() const;void setTabBar(QTabBar* tb);    //返回当前的 QTabBar。//受保护的。

    使用 tb 替换选项卡部件的 QTabBar 选项卡栏,注意:必须在添加任何其他选项卡之前
    调用此函数,否则将是未定义的。
    ⑨、 QWidget* cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const;
    返回角落 corner 处的小部件或 0。
    void setCornerWidget(QWidget* widget, Qt::Corner corner = Qt::TopRightCorner);
    把部件 widget 添加到指定的角落 corner 处(效果见下图)。仅选项卡位于上方或下方时
    才能使用。

            

    10、

    void setTabEnabled(int index, bool enabled);//设置选项卡的启用/禁用状态,禁用状态呈现出灰色。
    bool isTabEnabled(int index) const;//获取选项卡的启用/禁用状态
    void setTabIcon(int index, const QIcon& icon);//设置选项卡的图标
    QIcon tabIcon(int index) const;//获取选项卡的图标。
    void setTabText(int index, const QString &text);//设置选项卡的文本
    QString tabText(int index) const;//获取选项卡的文本。
    void setTabToolTip(int index, const QString &tip); //设置选项卡的提示文本
    QString tabToolTip(int index) const; //获取选项卡的提示文本。
    void setTabWhatsThis(int index, const QString &text);//设置选项卡的帮助文本
    QString tabWhatsThis(int index) const;//获取选项卡的帮助文本。

    8、 QTabWidget 类中的信号
    ①、 void currentChanged(int index); //信号
    当选项卡栏上的当前选项卡发生更改时发送此信号, index 为新选项卡的索引,若没
    有新的索引,则为-1(比如 QTabBar 中没有选项卡)。该信号比较重要。

    ②、 void tabBarClicked(int index);    //信号, qt5.2
    void tabBarDoubleClicked(int index);    //信号, qt5.2

    以上信号表示,单击或双击 index 处的选项卡时发送此信号, index 是单击选项卡的索
    引,若光标下没有选项卡,则为-1。
    ③、 void tabCloseRequested(int index); //信号
    当点击选项卡上的关闭按钮时发送此信号, index 为应删除的选项卡的索引。

    1. //m.h 文件的内容
    2. #ifndef M_H
    3. #define M_H
    4. #include<QtWidgets>
    5. #include <iostream>
    6. using namespace std;
    7. class B :public QTabWidget {
    8. Q_OBJECT
    9. public: B(QWidget* p = 0) :QTabWidget(p) { }
    10. public slots :
    11. void f() { removeTab(0); }
    12. }; //移除索引为零的选项卡
    13. #endif // M_H
    14. #include "m.h"
    15. int main(int argc, char *argv[]) {
    16. QApplication a(argc, argv);
    17. QWidget w;
    18. QWidget *pw = new QWidget; QWidget *pw1 = new QWidget; QWidget *pw2 = new QWidget; //容器
    19. QRadioButton *pr, *pr1, *pr2, *pr3, *pr4, *pr5;
    20. QPushButton *pb = new QPushButton("remove", &w);
    21. pr = new QRadioButton("AAA"); pr1 = new QRadioButton("BBB"); pr2 = new QRadioButton("CCC");
    22. pr3 = new QRadioButton("DDD"); pr4 = new QRadioButton("EEE"); pr5 = new QRadioButton("FFF");
    23. QVBoxLayout *pv = new QVBoxLayout; //由容器 pw 使用的布局
    24. QVBoxLayout *pv1 = new QVBoxLayout;
    25. QVBoxLayout *pv2 = new QVBoxLayout;
    26. //把子部件添加到容器中
    27. pv->addWidget(pr); pv->addWidget(pr1);
    28. pw->setLayout(pv); //容器:其中包含有其他部件的部件(为容器设置布局)
    29. pv1->addWidget(pr2); pv1->addWidget(pr3);
    30. pw1->setLayout(pv1);//容器:其中包含有其他部件的部件(为容器设置布局)
    31. pv2->addWidget(pr4); pv2->addWidget(pr5);
    32. pw2->setLayout(pv2);//容器:其中包含有其他部件的部件(为容器设置布局)
    33. B *pt = new B(&w); //创建 QTabWidget 部件,把容器添加到对应的选项卡之下。
    34. pt->addTab(pw, "AAA"); pt->addTab(pw1, "BBB"); pt->addTab(pw2, "CCC");
    35. //以下步骤可使用布局代替,以避免设置部件的位置和大小
    36. pb->move(22, 22); pt->move(22, 55); pt->resize(222, 111);
    37. cout << pt->indexOf(pw1) << endl; //输出 1。返回 pw1 所在的索引
    38. cout << pt->indexOf(pr) << endl; //输出-1,因为 pr 是 pw 的子部件,而不是 pt 的子部件。
    39. QObject::connect(pb, &QPushButton::clicked, pt, &B::f);
    40. //使用 QTabWidget 可省略类似以下的选项卡与容器的信号和槽的关联步骤。
    41. //QObject::connect(pt, SIGNAL(currentChanged(int)), ps, SLOT(setCurrentIndex(int)));
    42. w.resize(300, 200); w.show();
    43. return a.exec();
    44. }

  • 相关阅读:
    4.2、Linux进程(1)
    系统架构师备考倒计时18天(每日知识点)
    Java设计模式 | 基于订单批量支付场景,对策略模式和简单工厂模式进行简单实现
    微服务实战系列之玩转Docker(十六)
    6.Docker网络
    首台自主创新全空冷机组在三峡运行,图扑数字孪生机体
    实现二叉树先序,中序和后序遍历
    容器基础镜像的编写及最佳实践
    java线程和go协程
    Java 19 正式发布,改善多线程、并发编程难度
  • 原文地址:https://blog.csdn.net/zxf347085420/article/details/133034583