Как добавленным в процессе работы приложения элементам присвоить выполнение функции?

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

В программе планируется получать список с наименованиями (из БД), по которым будет вкладками заполняться QTabWidget. При клике на одну из вставленных вкладок должна вызываться какая-либо функция (например, функция отображения имени вкладки; запроса к БД с названием вкладки или просто какого-либо текста).

Пытаюсь создать таким образом фильтр. Если с заранее созданным интерфейсом ясно как прикрутить сигналы ко вкладкам и вызывать функции при клике, то вот как сделать это в зависимости от прочитанных данных - непонятно... Есть идея сделать вкладок 10, скрыть их, а в зависимости от прочитанных данных менять названия и делать видимыми. Возможно ли обойтись без такого костыля?

В коде ниже создан tabwidget и есть список, которыми нужно дополнить его. Список может изменяться.

main.py

import sys

from PyQt5 import QtWidgets
from ui import untitled


class MainWindow(QtWidgets.QMainWindow, untitled.Ui_Form):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.tabs = ["sun", "moon", "weather"]  # может меняться как кол-во, так и названия


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_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(706, 350)
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setGeometry(QtCore.QRect(140, 90, 361, 151))
        self.tabWidget.setStyleSheet("background-color: rgb(85, 0, 127)")
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")

        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "All"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

Ответы

▲ 0Принят

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

Сделал без скрытия через добавление

class MainWindow(QtWidgets.QWidget, untitled.Ui_Form):
    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)

    def click_tab(self, tab_index):
        tab_name = self.tabWidget.tabText(tab_index)
        print(f"SELECT FROM TABLE WHERE FIELD1 ='{tab_name}'")