Как сделать корректное удаление вкладок QTabWidget?

Рейтинг: 1Ответов: 1Опубликовано: 14.04.2023

Не получается удалить все вкладки в QTabWidget кроме вкладки с нулевым индексом. Какие-то из них не удаляются, хотя сохранить нужно только нулевую вкладку.

Пробовал через .clear() и добавление общей вкладки "Все" - вроде бы что-то получалось, но сейчас не получается воспроизвести это даже как примерную ветку решения...
Ощущение, что .removeTab() игнорирует их. Индексы, кажется, соблюдаются...

Как всё-таки удалить при клике на кнопку все вкладки, кроме вкладки с нулевым индексом, заполнить их новыми с названиями из списка в методе, чтобы при клике на них также выводились имена этих вкладок?

Табвиджет при инициализации При клике добавляются новые и остаётся старая

main.py

import sys

from PyQt5 import QtWidgets
from ui import untitled


class MainWindow(QtWidgets.QMainWindow, untitled.Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.tabs = ["sun", "moon", "weather"]  # Вкладки при инициализации

        count_tab = len(self.tabs)
        for i in range(1, count_tab+1):  # первая вкладка должна остаться
            tab = QtWidgets.QWidget()
            self.tabWidget.addTab(tab, self.tabs[i-1])

        self.tabWidget.tabBarClicked.connect(self.click_tab)
        self.pushButton.clicked.connect(lambda: self.fill_tabs(0))
        self.pushButton_2.clicked.connect(lambda: self.fill_tabs(1))

    def click_tab(self, tab_index):  # Метод, возвращающий название вкладки
        tab_name = self.tabWidget.tabText(tab_index)
        print(tab_name)

    def fill_tabs(self, btn):
        if self.tabWidget.count() > 1:  # Если были заполнены вкладки, то удаляем старые
            for i in range(1, self.tabWidget.count()):
                self.tabWidget.removeTab(i)

        if btn == 0:  # Если нажали "Добавить новые"
            new_tabs = ["Tea", "Coffee"]
            count_tab = len(new_tabs)
            for i in range(1, count_tab + 1):  # первая вкладка должна остаться
                tab = QtWidgets.QWidget()
                self.tabWidget.addTab(tab, new_tabs[i - 1])  # Добавляем 2 новые

        elif btn == 1:  # Если нажали "Вернуть старые"
            count_tab = len(self.tabs)
            for i in range(1, count_tab + 1):  # первая вкладка должна остаться
                tab = QtWidgets.QWidget()
                self.tabWidget.addTab(tab, self.tabs[i - 1])  # заполняем тем, что было


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()


untitled.py (конвертировал из .ui в .py)

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(544, 346)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(140, 40, 311, 201))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 70, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(20, 140, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 544, 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.tab), _translate("MainWindow", "Все"))
        self.pushButton.setText(_translate("MainWindow", "Add_new"))
        self.pushButton_2.setText(_translate("MainWindow", "Return_old"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Ответы

▲ 1Принят

Если вы хотите не удалять вкладку с индексом 0, то вам надо в цикле все время удалять вкладку с индексом 1.

# ---------------------> v <------- !!!
self.tabWidget.removeTab(1)

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

#from ui import untitled
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(544, 346)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(140, 40, 311, 201))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 70, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(20, 140, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 544, 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.tab), _translate("MainWindow", "Все"))
        self.pushButton.setText(_translate("MainWindow", "Add_new"))
        self.pushButton_2.setText(_translate("MainWindow", "Return_old"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        
        self.tabs = ["sun", "moon", "weather"]     # Вкладки при инициализации
         
#        count_tab = len(self.tabs)
#        for i in range(1, count_tab+1):           # первая вкладка должна остаться
        for tab_name in self.tabs:
            tab = QtWidgets.QWidget()
#            self.tabWidget.addTab(tab, self.tabs[i-1])
            self.tabWidget.addTab(tab, tab_name)

        self.tabWidget.tabBarClicked.connect(self.click_tab)
        self.pushButton.clicked.connect(lambda: self.fill_tabs(0))
        self.pushButton_2.clicked.connect(lambda: self.fill_tabs(1))

    def click_tab(self, tab_index):       # Метод, возвращающий название вкладки
        tab_name = self.tabWidget.tabText(tab_index)
        print(f'{tab_index} - {tab_name}')

    def fill_tabs(self, btn):
        # Если были заполнены вкладки, то удаляем старые
        if self.tabWidget.count() > 1:  
#            for i in range(1, self.tabWidget.count()):
            for i in range(self.tabWidget.count()-1):
# -------------------------------------> v <---------------------------- !!!
                self.tabWidget.removeTab(1)
        
        if btn == 0:                                      # "Добавить новые"
            new_tabs = ["Tea", "Coffee"]
            for tab_name in new_tabs:
                tab = QtWidgets.QWidget()
                self.tabWidget.addTab(tab, tab_name)

        elif btn == 1:                                    #  "Вернуть старые"
            for tab_name in self.tabs:  
                tab = QtWidgets.QWidget()
                self.tabWidget.addTab(tab, tab_name) 
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

введите сюда описание изображения

введите сюда описание изображения