Как передавать значения не только из последней вкладки? 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())