QTabWidget 用来分页显示
重要函数:
1.void setTabText(int, QString); //设置页面的名字.
2.void setTabToolTip(QString); //设置页面的提示信息.
3.void setTabEnabled(bool); //设置页面是否被激活.
4.void setTabPosition(QTabPosition::South); //设置页面名字的位置.
5.void setTabsClosable(bool); //设置页面关闭按钮。
6.int currentIndex(); //返回当前页面的下标,从0开始.
7.int count(); //返回页面的数量.
8.void clear(); //清空所有页面.
9.void removeTab(int); //删除页面.
10.void setMoveable(bool); //设置页面是否可被拖拽移动.
11.void setCurrentIndex(int); //设置当前显示的页面.

signals:
1.void tabCloseRequested(int). //当点击第参数个选项卡的关闭按钮的时候,发出信号.
2.void tabBarClicked(int). //当点击第参数个选项卡的时候,发出信号.
3.void currentChanged(int). //当改变第参数个选项卡的时候,发出信号.
4.void tabBarDoubleClicked(int). //当双击第参数个选项卡的时候,发出信号.
c.cpp

#include "c.h"
c::c(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);//连接信号与槽.connect(ui.insertButton, SIGNAL(clicked()), this, SLOT(addPageSlot()));    connect(ui.removeButton, SIGNAL(clicked()), this, SLOT(removePageSlot()));    connect(ui.dragButton, SIGNAL(clicked()), this, SLOT(dragPageSlot()));
}
c::~c()
{}
void c::addPageSlot()
{//定义一个QWidget.QWidget *temp = new QWidget;//在当前页面的后面插入一个新的页面.ui.tabWidget->insertTab(ui.tabWidget->currentIndex() + 1, temp, QIcon("Icons/2.png"), QString::number(count));    //显示新的页面.ui.tabWidget->setCurrentIndex(ui.tabWidget->indexOf(temp));count++;
}
void c::removePageSlot()
{//删除当前的页面.ui.tabWidget->removeTab(ui.tabWidget->currentIndex());}
void c::dragPageSlot()
{//设置页面项是可被移动的.ui.tabWidget->setMovable(true);}

c.h

#ifndef C_H
#define C_H
#include <QtWidgets/QMainWindow>
#include "ui_c.h"
#include <QTabWidget>
#include <QPushButton>
class c : public QMainWindow
{Q_OBJECTpublic:c(QWidget *parent = 0);~c();private slots:   void addPageSlot();    void removePageSlot();    void dragPageSlot();private:Ui::cClass ui;   int count = 0;
};#endif

QTabWidget添加选项卡的方法可用使用addTab方法和insertTab方法。
1、增加选项卡的addTab方法

addTab用于给QTabWidget增加一个选项卡,选项卡位置在现所有选项卡后面,调用语法如下:

int addTab(QWidget page, str label)
int addTab(QWidget page, QIcon icon, str label)

说明:

page为一个QWidget 实例对象,其名字为对应选项卡的名字
label为选项卡栏显示的选项卡标题文字,文字中可通过与符号(&)带一个快捷键字母,对应快捷键为:Alt+与符号后面字母
icon为选项卡栏显示的选项卡图标
返回值为新加选项卡在选项卡栏中的位置索引

注意:

如果在QTabWidget所在窗口show()之后调用addTab(),布局系统将尝试调整部件层次结构可能导致闪烁。为了防止这种情况可以在更改之前将窗口的QWidget.updateselebled属性设置为False,在更改完成时将属性设置为True,使部件再次接收绘制事件。
示例代码:

 self.tab_reportManner = QtWidgets.QWidget()self.tab_reportManner.setObjectName("tab_reportManner")icon.addPixmap(QtGui.QPixmap(":/IT/图像文件/blog.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.tabWidget.addTab(self.tab_reportManner, icon, "疫情上报方式")

2、插入选项卡的insertTab方法

QTabWidget的insertTab方法用于在QTabWidget指定位置插入一个选项卡,调用语法如下:

int insertTab(int index, QWidget page, str label)
int insertTab(int index, QWidget page, QIcon icon, str label)

说明:

insertTab方法的参数除了多了个index参数外,其他参数和返回值都是一样
如果index值超出范围,则新选项卡在所有选项卡最后面
如果在调用此函数之前QTabWidget没有选项卡,则插入选项卡将成为当前页,否则当前页保持不变

Qt–多页面切换组件

一.多页面切换组件
多页面的切换在我们日常的软件使用中是十分广泛的,有着很好的便捷性,下面一张图片展示了多页面的使用的便捷性

可以看到用鼠标点击不同的标题时会出现不同的页面内容

A.Qt中的多页面切换组件QTabWidget

Qt中为多页面切换的实现提供了一个专门的类QTabWidget,它可以实现能够在同一个窗口中自由切换不同页面的内容,并且是一个容器类型的组件,提供友好的页面切换方式,在QTabWidget类中提供了很多在工程中实用的函数,比如设置Tab标签的位置void setTabPosition(TabPosition)(North South West East),设置Tab的外观 void setTabShape(),设置Tab的可关闭模式void setTabsClosable()等各种在实际应用中用的较多的函数,具体的函数可以在Qt助手进行查询。

QTabWidget的使用方式–在Qt中的应用程序中创建QTabWidget的对象,将其他的QWiget对象加入该对象中(在QTabWidget对象中加入一个组件将生成一个新的页面,同时QTabWidget对象每次只能加入一个QWiget对象),但是在实际的使用中每个页面会有多个的子组件,这时应该在工程中创建容器类型的组建对象,将多个子组件在容器对象中布局,最后将容器对象加入QTabWidget中生成新的页面.

1.能够在同一窗口中自由切换不同页面的内容

2.是一个容器类型的组件,同时提供友好的页面切换方式

Qt–多页面切换组件
QTabWidget的使用方式
1.在应用程序中创建QTabWidget的对象
2.将其他QWidget对象加入该对象中

实现过程
1.创建容器类的组件对象
2.将多个子组件在容器对象中布局
3.将容器对象加入QTabWidget中生成新的页面
Qt–多页面切换组件
QTabWidget组件的基本用法
Qt–多页面切换组件

B.QTabWidget组件的高级用法
1.设置Tab标签的位置
2.设置Tab的外观
3.设置Tab的可关闭模式

QTabWidget组件预定义的信号
void currentChange(int index)–当前显示的页面发送变化,index为新页面下标
void tabCloseRequsted(int index)–位置为index页面的关闭按钮被点击发出关闭请求
代码示例
Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTableWidget>class Widget : public QWidget
{Q_OBJECTQTabWidget m_tabWidget;
protected slots:void onTabCurrentChanged(int index);void onTabCloseRequested(int index);
public:Widget(QWidget *parent = 0);~Widget();
};#endif // WIDGET_H

Widget.cpp

#include "Widget.h"
#include <QPlainTextEdit>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent)
{//QTabWidget的基本设置m_tabWidget.setParent(this);m_tabWidget.move(10, 10);m_tabWidget.resize(200, 200);m_tabWidget.setTabPosition(QTabWidget::North);m_tabWidget.setTabShape(QTabWidget::Triangular);m_tabWidget.setTabsClosable(false);QPlainTextEdit* edit = new QPlainTextEdit(&m_tabWidget);edit->insertPlainText("页面1");m_tabWidget.addTab(edit, "1st");QWidget* widget = new QWidget(&m_tabWidget);QVBoxLayout* layout = new QVBoxLayout();QLabel* lbl = new QLabel(widget);QPushButton* btn = new QPushButton(widget);lbl->setText("页面2");lbl->setAlignment(Qt::AlignCenter);btn->setText("页面2");layout->addWidget(lbl);layout->addWidget(btn);widget->setLayout(layout);m_tabWidget.addTab(widget, "2nd");m_tabWidget.setCurrentIndex(1);connect(&m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(onTabCurrentChanged(int)));connect(&m_tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(onTabCloseRequested(int)));
}void Widget::onTabCurrentChanged(int index)
{qDebug() << "Page change to: " << index;
}void Widget::onTabCloseRequested(int index)
{m_tabWidget.removeTab(index);
}Widget::~Widget()
{}

运行的结果如图所示

QTabWidget实现了双击关闭标签页

重载了QTabWidget(由于tabBar()是protected),这样就可以获取到标签了。

1 class Tab : public QTabWidget
2 {3     Q_OBJECT
4 public:
5     Tab(QWidget *parent = 0);
6     QTabBar* GetBar();
7 protected:
8     void mousePressEvent(QMouseEvent *event);
9 };

然后在实现一个事件过滤器,首先判断事件是双击事件,然后判断是否为标签位置,如果是则删除当前标签页,由于双击事件中必触发单击,即标签页选中事件,因此无需考虑双击其他标签页引起的index变更问题。

 1 #ifndef MYEVENTFILTER_H2 #define MYEVENTFILTER_H3 #include <QMainWindow>4 #include <QMouseEvent>5 #include "tab.h"6 7 extern int tabindex_current;8 extern int tabindex_old;9 extern Tab *tabWidget;
10 extern QPoint tableft;
11 extern int tabwidth;
12 extern int tabheight;
13
14 //实现双击关闭Tab标签
15 class myEventFilter: public QObject
16 {17   public:
18   myEventFilter():QObject()
19   {};
20   ~myEventFilter(){};
21
22   bool eventFilter(QObject* object,QEvent* event)
23   {24       if (event->type()==QEvent::MouseButtonDblClick)
25       {26           QMouseEvent *e = static_cast<QMouseEvent*>(event);
27           QPoint pos = e->pos();
28           int x1 = tableft.x();
29           int x2 = tableft.x()+tabwidth;
30           int y1 = tableft.y();
31           int y2 = tableft.y()+tabheight;
32           if (pos.x() >= x1 && pos.y() >= y1 && pos.x() <= x2 && pos.y() <= y2)
33               tabWidget->removeTab(tabindex_current);
34       }
35       return QObject::eventFilter(object,event);
36   };
37 };
38
39 #endif // MYEVENTFILTER_H
最后绑定到主函数main中,这样就可捕捉到所有的事件了:
1 qApp->installEventFilter(new myEventFilter());

另外,需在标签页切换时更新宽度信息(高度无需更新):1 void MainWindow::updateBar()
2 {3     tabindex_current = tabWidget->currentIndex();
4     tabindex_old = tabindex_current;
5     QTabBar *bar = tabWidget->GetBar();
6     if (bar->size().width() > 0)
7          tabwidth = bar->size().width();
8 }

QTabWidget添加关闭子标签功能

QTabWidget添加关闭子标签功能,QTabWidget 有个属性 tabsClosable ,将其设置为True即可出现关闭按钮。 默认情况下,每个标签上的关闭按钮是没有任何响应的,我们需要自己动手为他添加关闭响应。 关闭信号为 void tabCloseRequested(int index) 关闭函数为 void removeTab(int index) 注意关闭标签的是一个普通公共函数,不是槽函数,不可以直接与信号相连,我们需要自己手动定义个接受 int类型的槽函数,然后把参数再传递给关闭函数。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTabWidget>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->tabWidget,SIGNAL(tabCloseRequested(int)),this,SLOT(removeSubTab(int)));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::removeSubTab(int index)
{ui->tabWidget->removeTab(index);
}void MainWindow::on_pushButton_clicked()
{QTextEdit *edit=new QTextEdit;ui->tabWidget->addTab(edit,"hitemp 1");
}

QTabWidget——创建标签页的多页面切换相关推荐

  1. Vue开发实例(16)之创建标签页

    引言 Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,如果你是打算学习Vue的开发流程,那么来吧,明哥带你快速上手.带你飞! 即使你并非前端开发人员,对前端的开发流程进行一定的了 ...

  2. 新版火狐浏览器标签页覆盖原页面解决方案

    新版火狐浏览器标签页覆盖原页面解决方案 安装插件:http://mozilla.com.cn/thread-319507-1-1.html 立即有效!

  3. router vue 页签文字_vue-router实现tab标签页(单页面)详解

    vue-router 是 Vue.js 官方的路由插件,适合用于构建标签页应用.Vue 的标签页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来,vue-router 会把各个组件 ...

  4. jQuery EasyUI使用教程之创建标签页

    2019独角兽企业重金招聘Python工程师标准>>> <jQuery EasyUI最新版下载> 本教程将展示如何使用easyui创建一个标签组件.标签可以动态地添加或删 ...

  5. python selenium 对浏览器标签页进行关闭和切换

    1.关闭浏览器全部标签页 driver.quit() 2.关闭当前标签页(从标签页A打开新的标签页B,关闭标签页A) driver.close() 3.关闭当前标签页(从标签页A打开新的标签页B,关闭 ...

  6. 同源跨窗口通信:网易云音乐不同标签页打开同一页面,暂停原先标签页音频播放

    原文见:语雀 有个声音很好听的小帅哥问我说,如果当前浏览器打开一个标签页,页面播放着音乐,然后相同的链接又在另外一个页面打开,该如何将之前的页面音频停止播放. 有小帅哥问问题,我当然要回答啦(其实是我 ...

  7. Windows Terminal 使用管理员身份创建标签页

    在Windows Terminal里运行指令,经常容易遇到某些操作需要使用管理员权限,但是Terminal却忘记使用管理员权限打开的情况.不仅如此,以管理员权限打开Windows Terminal步骤 ...

  8. hbuilder HTML页面跳转,基于HBuilder开发手机APP-主页/跳转页面/切换选项卡(示例代码)...

    所需要的子页一一对应,写入数组,在javascript里 mui.plusReady写入手机端的准备要求,内部写入函数: 在这里我使用的是预加载:plus.webview.create(objYe[i ...

  9. 在Angular的index.html里插入script,拦截所有动态创建标签页的场景

    注意,下面这段代码只能插入在Angular应用的index.html里,直接插入任何Component的index.html里不会生效: <script>console.log(" ...

最新文章

  1. python爬虫人门(10)Scrapy框架之Downloader Middlewares
  2. 在featureDataset和workspace下創建featureclass
  3. 语音识别:时间序列Damerau–Levenshtein距离
  4. VS+QT和qtcreator工程的互相转换
  5. 【Python小工具函数】各种日期格式的转换、在某个日期上减去n天、判断List中是否含有数字
  6. 鼻塞用鼻喷剂-调研(成分+刺激性)
  7. 前端实现连连看小游戏(1)
  8. 【ArcGIS遇上Python】ArcGIS批量为多个矢量图层添加一个或多个字段(Add Field)案例实现
  9. 世界上最美的40个小镇,你见过多少个?
  10. 【WXS数据类型】Array
  11. Influxdb的更新操作
  12. ubuntu安装arm-linux-gcc
  13. asterisk远程注册
  14. HFSS入门学习(一)
  15. ECshop商城程序常见的97个小问题汇总
  16. 标注工具: Label Studio
  17. ES6/7 + Babel 编译器-郭永峰-专题视频课程
  18. 火狐浏览器的一些插件
  19. 0到100之间的阶乘linux算法,零基础学算法-阶乘
  20. 自动化测试面试题整理出炉附答案,建议收藏

热门文章

  1. C语言描述死锁检测算法,天津科技大学计算机科学与信息工程学院2013考研复试考试大纲...
  2. 求一个防关联浏览器的插件,防关联浏览器破解版
  3. 大数据 客户标签体系_基于大数据的用户标签体系建设思路
  4. CSRF漏洞检测与发现
  5. 网站漏洞挖掘测试服务
  6. java中jcl_Java日志框架——JCL
  7. 引导盘的引导文件在哪
  8. m3u8的浏览器播放器
  9. python 升级setuptools_PIP无法升级setuptools
  10. android 飞机姿态控件