QT5 QTabWidget 隐藏Tab 或 显示Tab 正确的解决方案

2023-05-16

前言:

        因为业务原因,需要根据场景动态隐藏某个tab和显示某个tab,本着能不动手就不动手的原则我翻遍各大搜索引擎看到大部分人给出的解决方案的只是草草的说隐藏的时候remove,显示的时候再加回去,抱着白Piao的心态翻了3个小时由于半夜1点扛(Piao)不下去了,还是自己动手吧。

使用方式:

        先给出示例,能对大家的胃口再白Piao寡人后面的代码。

        ctrl+c,然后ctrl+v复制粘贴本文源代码,在QT设计师中将你自己得QTabWidget提升为本文中的TabWidgetPlus。什么?怎么提升为xxx?自己查。

使用示例:

//使用方式很简单,想隐藏或者显示哪个tab直接hideTab或者showTab,下标从0开始。
ui.tab->hideTab(0);//隐藏第一个tab
ui.tab->showTab(0);//再把第一个tab显示出来

控件源代码:

头文件:

#ifndef __GUI_TABWIDGETPLUS_H__
#define __GUI_TABWIDGETPLUS_H__

#include <qtabwidget.h>
/*********************************************************************************
  *Copyright(C),MountCloud.org
  *FileName: tabwidgetplus.h
  *Author:  MountCloud
  *Version:  1.0
  *Date:  2021-07-30
  *Description:  //简易的显示和隐藏tab。适用于非动态改变tab数量,如果需要动态改变tab数量需要自行根据业务调用reloadPlusTabs()。
  *				//reloadPlusTabs在设计上是私有的的,所以自行重写add或者insert方法来更新plusTabs,我只是满足我非动态更新tab数量的需求。
**********************************************************************************/
class TabWidgetPlusTab {
public:
	QString text;
	QIcon icon;
	QWidget* widget;
	bool status = true;
};
class TabWidgetPlus : public QTabWidget{
	Q_OBJECT
public:
	TabWidgetPlus(QWidget* parent = nullptr);
	~TabWidgetPlus();
	//隐藏tab
	void hideTab(int index);
	//显示tab
	void showTab(int index);
private:
	//映射的tabs
	QList<TabWidgetPlusTab> plusTabs;
	//刷新映射列表
	void reloadPlusTabs();
	//返回真实的index
	int getRealIndex(int index);
};

#endif

CPP文件:

#include "tabwidgetplus.h"
#include <qtabbar.h>
TabWidgetPlus::TabWidgetPlus(QWidget* parent) : QTabWidget(parent) {

}

TabWidgetPlus::~TabWidgetPlus() {
}

void TabWidgetPlus::showTab(int index) {

	if (this->plusTabs.size() == 0) {
		this->reloadPlusTabs();
	}
	if (index > this->plusTabs.size() - 1) {
		return;
	}
	if (!plusTabs[index].status) {
		//获取当前真正要处理的index
		int realIndex = getRealIndex(index);
		if (realIndex == -1) {
			return;
		}
		//添加tab
		TabWidgetPlusTab tempPt = plusTabs[index];
		QString text = tempPt.text;
		QIcon icon = tempPt.icon;
		QWidget* tabWidget = tempPt.widget;
		insertTab(realIndex, tabWidget, icon, text);
		//设置映射的状态
		(&plusTabs[index])->status = true;
	}
}

void TabWidgetPlus::hideTab(int index) {
	if (this->plusTabs.size() == 0) {
		this->reloadPlusTabs();
	}
	if (index > this->plusTabs.size() - 1) {
		return;
	}
	if (plusTabs[index].status) {
		//获取当前真正要处理的index
		int realIndex = getRealIndex(index);
		if (realIndex == -1) {
			return;
		}
		//删掉tab
		this->removeTab(realIndex);
		//设置映射的状态
		(&plusTabs[index])->status = false;
	}
}

void TabWidgetPlus::reloadPlusTabs() {
	if(this->plusTabs.size()>0){
		this->plusTabs.clear();
	}
	int tabcount = this->count();
	if (tabcount>0) {
		for (int i = 0; i < tabcount; i++) {
			TabWidgetPlusTab tempPt;
			QWidget* tabWidget = this->widget(i);
			QString text =this->tabBar()->tabText(i);
			QIcon icon = this->tabBar()->tabIcon(i);
			tempPt.text = text;
			tempPt.icon = icon;
			tempPt.widget = tabWidget;
			tempPt.status = true;
			this->plusTabs.append(tempPt);
		}
	}
}

int TabWidgetPlus::getRealIndex(int index) {
	if (this->plusTabs.size() == 0) {
		reloadPlusTabs();
	}
	if (index == 0) {
		return 0;
	}
	if (index > this->plusTabs.size() - 1) {
		return -1;
	}
	int realIndex = 0;
	for (int i = 0; i < index; i++) {
		TabWidgetPlusTab twpt = plusTabs[i];
		if (twpt.status) {
			realIndex = realIndex + 1;
		}
	}
	return realIndex;
}

注意:

复制粘贴爽了点个赞呗。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT5 QTabWidget 隐藏Tab 或 显示Tab 正确的解决方案 的相关文章

随机推荐