Как передавать значения не только из последней вкладки? Pyqt

Есть приложение которое по кнопке создаёт новую вкладку, во вкладке есть QLineEdit, с которого я хочу получать значения, но после его подключения значения QLineEdit считываются только из последней вкладки.

main.py

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
# Имопорт самописного кода
import createTab
# Импорт остальных библиотек
import sys


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(600, 400)
        self.initUI()

    def initUI(self):
        #   Создание виджета для Вкладок
        self.tabWidget = QTabWidget()
        self.tabWidget.setDocumentMode(True)
#   Вкладка 1
        self.mainTab = QWidget()

#   Кнопки
        self.connectPortBtn = QPushButton('Подключиться', self.mainTab)
#   Error Лайбл
        self.errorsLabel = QLabel('Ошибок не обнаружено', self.mainTab)
        self.errorsLabel.setWordWrap(True)

#   Расположение виджетов во вкладке 'Подключение:'
        self.mainTabVert = QVBoxLayout()
        self.tab1Grib = QGridLayout(self.mainTab)
        self.mainTabVert.addWidget(self.errorsLabel)
        self.mainTabVert.addWidget(self.connectPortBtn)
        self.mainTabVert.addWidget(self.tabWidget)
        self.setLayout(self.mainTabVert)
#   Подключение виджетов(кнопок и тд и тп)
        self.connectPortBtn.pressed.connect(self.connectToLab)

    def connectToLab(self):
        createTab.createCommonTab(self, 'zxc', 'cxz', ('asd', 'fw'), 'asd')

        self.timeToUpdateLineE.textChanged.connect(self.timeUpdate)

    def timeUpdate(self):
        self.timeCurrentUpdate = self.timeToUpdateLineE.text()
        print(self.timeCurrentUpdate)


# Запуск
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec())

createTab.py

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


def createCommonTab(self, name, init, rangeDevice, deviceName):
    # Создание Вкладки
    self.tab = QWidget()
    self.tabWidget.addTab(self.tab, name)
# Всякое повторяющееся из вкладки во вкладку
    self.validator = QIntValidator(0, 3600000, self.tab)

    self.timeToUpdateLable = QLabel('Период обновлений, мс:', self.tab)
    self.timeToUpdateLineE = QLineEdit('100', self.tab)
    self.timeToUpdateLineE.setValidator(self.validator)


# Расположение
    self.commonTabGrib = QGridLayout(self.tab)

    self.commonTabGrib.addWidget(self.timeToUpdateLable, 1, 0)
    self.commonTabGrib.addWidget(self.timeToUpdateLineE, 1, 1)

    return self.timeToUpdateLineE

Нашёл решение на C++, как сделать это же но на питоне? или есть какое-то более лаконичное решение?


Ответы (1 шт):

Автор решения: gil9red

Сделал отдельный класс для виджета вкладки и в его рамках выполняется обработка ввода текста

Также, для обратной связи от MyTab к MainWindow сделал сигнал about_time_update, который отсылают вкладки при timeUpdate

Пример:

import traceback
import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


def log_uncaught_exceptions(ex_cls, ex, tb):
    text = '{}: {}:\n'.format(ex_cls.__name__, ex)
    text += ''.join(traceback.format_tb(tb))

    print(text)
    QMessageBox.critical(None, 'Error', text)
    sys.exit(1)


sys.excepthook = log_uncaught_exceptions


class MyTab(QWidget):
    about_time_update = pyqtSignal(str)

    def __init__(self):
        super().__init__()

        self.validator = QIntValidator(0, 3600000)

        self.timeToUpdateLable = QLabel('Период обновлений, мс:')
        self.timeToUpdateLineE = QLineEdit('100')
        self.timeToUpdateLineE.setValidator(self.validator)

        # Расположение
        layout = QGridLayout(self)
        layout.addWidget(self.timeToUpdateLable, 1, 0)
        layout.addWidget(self.timeToUpdateLineE, 1, 1)

        self.timeToUpdateLineE.textChanged.connect(self.timeUpdate)

    def timeUpdate(self):
        self.timeCurrentUpdate = self.timeToUpdateLineE.text()
        print('MyTab', self.timeCurrentUpdate)

        self.about_time_update.emit(self.timeCurrentUpdate)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(600, 400)
        self.initUI()

    def initUI(self):
        #   Создание виджета для Вкладок
        self.tabWidget = QTabWidget()
        self.tabWidget.setDocumentMode(True)
        #   Вкладка 1
        self.mainTab = QWidget()

        #   Кнопки
        self.connectPortBtn = QPushButton('Подключиться', self.mainTab)
        #   Error Лайбл
        self.errorsLabel = QLabel('Ошибок не обнаружено', self.mainTab)
        self.errorsLabel.setWordWrap(True)

        #   Расположение виджетов во вкладке 'Подключение:'
        self.mainTabVert = QVBoxLayout()
        self.tab1Grib = QGridLayout(self.mainTab)
        self.mainTabVert.addWidget(self.errorsLabel)
        self.mainTabVert.addWidget(self.connectPortBtn)
        self.mainTabVert.addWidget(self.tabWidget)
        self.setLayout(self.mainTabVert)
        #   Подключение виджетов(кнопок и тд и тп)
        self.connectPortBtn.pressed.connect(self.connectToLab)

    def connectToLab(self):
        self.createCommonTab('zxc', 'cxz', ('asd', 'fw'), 'asd')

    def createCommonTab(self, name, init, rangeDevice, deviceName):
        tab = MyTab()
        tab.about_time_update.connect(self.on_about_tab_time_update)
        
        self.tabWidget.addTab(tab, name)

    def on_about_tab_time_update(self, time_update: str):
        tab: MyTab = self.sender()
        print(tab, time_update)


# Запуск
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec())
→ Ссылка