I built a functionality for add new tabs in which only the new tabs has a close button, I mean the "Tab 1" and the "+" don't has the close button. So this it's the code:
tabs.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(628, 504)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(36, 34, 541, 396))
self.tabWidget.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded)
self.tabWidget.setTabsClosable(False)
self.tabWidget.setObjectName("tabWidget")
self.tab1 = QtWidgets.QWidget()
self.tab1.setObjectName("tab1")
self.tabWidget.addTab(self.tab1, "")
self.tab2 = QtWidgets.QWidget()
self.tab2.setObjectName("tab2")
self.tabWidget.addTab(self.tab2, "")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 628, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab1), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab2), _translate("MainWindow", "+"))
main.py
from tabs import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgets
class Tab(QtWidgets.QMainWindow, Ui_MainWindow):
tabs_list = []
def __init__(self):
super().__init__()
self.setupUi(self)
self.tabWidget.tabBarClicked.connect(self.newTab)
self.tabs_list.append(self.tab1)
self.tabs_list.append(self.tab2)
def newTab(self, event):
if event == len(self.tabs_list) - 1:
tab = QtWidgets.QWidget()
self.tabWidget.addTab(tab, "+")
self.tabs_list.append(tab)
self.tabWidget.setTabText(len(self.tabs_list) - 2, "Tab " + str(len(self.tabs_list) - 1))
self.setClosableTabs()
def setClosableTabs(self):
self.tabWidget.setTabsClosable(False)
self.tabWidget.setTabsClosable(True)
self.tabWidget.tabBar().setTabButton(0, QtWidgets.QTabBar.RightSide, None)
self.tabWidget.tabBar().setTabButton(len(self.tabs_list) - 1, QtWidgets.QTabBar.RightSide, None)
self.tabWidget.tabCloseRequested.connect(self.closeTab)
def closeTab(self, event):
print("close tab: ", event)
self.tabWidget.removeTab(event)
When I tried to add the close functionality I ran into with the event that contains the index of the tab that I want to close its triggered as many times as number of tabs there are, so then its close more than only one tab. What I'm doing wrong?

