Как передать значения заполненных полей в переменную в главном классе?
У меня есть главное окно (класс), в котором я вызываю по клику ту или иную форму фильтра. Файл fil.py содержит в себе все эти окна в виде классов, которые, по мере необходимости, создаются и подрубаются в этот файл (чтобы не загромождать main.py).
Выбранная форма заполняется какими-либо данными, а по клику на кнопку "Применить" данные с полей должны передаться в основной файл (класс) в созданный при инициализации параметр (просто далее я с этими данными в методе провожу манипуляции.
Мне нужна возможность их потрогать). Я пытался ретёрнить окна с .super()
, пересоздавать их и как-то обращаться через parent к методам/полям - не получилось...
main.py
import sys
from PyQt5 import QtWidgets
import main_ui
import fil # файл с классами фильтров (разных окон)
class MainWindow(QtWidgets.QMainWindow, main_ui.Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.fil1 = fil.Filter1()
self.fil2 = fil.Filter2()
self.btnOpenFilter.clicked.connect(lambda: self.fil1.show())
self.btnOpenFilter_2.clicked.connect(lambda: self.fil2.show())
self.data = "" # В этот параметр нужно записать данные, введённые в окнах
def call_data(self): # В этом методе отобразить поля, которые были заполнены
print(self.data)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
fil.py
from PyQt5 import QtWidgets
import win1
import win2
class Filter1(QtWidgets.QWidget, win1.Ui_winFilter):
def __init__(self):
super().__init__()
self.setupUi(self)
self.btnAccept.clicked.connect(self.close)
self.btnCancel.clicked.connect(self.close)
# def get_fields(self):
# return (self.lineEdit.text()......)
class Filter2(QtWidgets.QWidget, win2.Ui_winFilter2):
def __init__(self):
super().__init__()
self.setupUi(self)
self.btnAccept.clicked.connect(self.close)
self.btnCancel.clicked.connect(self.close)
main_ui.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(443, 334)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.btnOpenFilter = QtWidgets.QPushButton(self.centralwidget)
self.btnOpenFilter.setGeometry(QtCore.QRect(90, 120, 101, 31))
self.btnOpenFilter.setObjectName("btnOpenFilter")
self.btnOpenFilter_2 = QtWidgets.QPushButton(self.centralwidget)
self.btnOpenFilter_2.setGeometry(QtCore.QRect(260, 120, 101, 31))
self.btnOpenFilter_2.setObjectName("btnOpenFilter_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 443, 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)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.btnOpenFilter.setText(_translate("MainWindow", "Открыть фильтр1"))
self.btnOpenFilter_2.setText(_translate("MainWindow", "Открыть фильтр2"))
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_())
win1.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_winFilter(object):
def setupUi(self, winFilter):
winFilter.setObjectName("winFilter")
winFilter.resize(241, 229)
self.lineEdit = QtWidgets.QLineEdit(winFilter)
self.lineEdit.setGeometry(QtCore.QRect(60, 50, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.btnAccept = QtWidgets.QPushButton(winFilter)
self.btnAccept.setGeometry(QtCore.QRect(40, 160, 75, 23))
self.btnAccept.setObjectName("btnAccept")
self.btnCancel = QtWidgets.QPushButton(winFilter)
self.btnCancel.setGeometry(QtCore.QRect(130, 160, 75, 23))
self.btnCancel.setObjectName("btnCancel")
self.lineEdit_2 = QtWidgets.QLineEdit(winFilter)
self.lineEdit_2.setGeometry(QtCore.QRect(60, 100, 113, 20))
self.lineEdit_2.setObjectName("lineEdit_2")
self.retranslateUi(winFilter)
QtCore.QMetaObject.connectSlotsByName(winFilter)
def retranslateUi(self, winFilter):
_translate = QtCore.QCoreApplication.translate
winFilter.setWindowTitle(_translate("winFilter", "Form"))
self.btnAccept.setText(_translate("winFilter", "Применить"))
self.btnCancel.setText(_translate("winFilter", "Отмена"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
winFilter = QtWidgets.QWidget()
ui = Ui_winFilter()
ui.setupUi(winFilter)
winFilter.show()
sys.exit(app.exec_())
win2.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_winFilter2(object):
def setupUi(self, winFilter2):
winFilter2.setObjectName("winFilter2")
winFilter2.resize(241, 229)
winFilter2.setStyleSheet("background-color: gray;")
self.lineEdit = QtWidgets.QLineEdit(winFilter2)
self.lineEdit.setGeometry(QtCore.QRect(60, 50, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.btnAccept = QtWidgets.QPushButton(winFilter2)
self.btnAccept.setGeometry(QtCore.QRect(40, 160, 75, 23))
self.btnAccept.setObjectName("btnAccept")
self.btnCancel = QtWidgets.QPushButton(winFilter2)
self.btnCancel.setGeometry(QtCore.QRect(130, 160, 75, 23))
self.btnCancel.setObjectName("btnCancel")
self.lineEdit_2 = QtWidgets.QLineEdit(winFilter2)
self.lineEdit_2.setGeometry(QtCore.QRect(60, 100, 113, 20))
self.lineEdit_2.setObjectName("lineEdit_2")
self.retranslateUi(winFilter2)
QtCore.QMetaObject.connectSlotsByName(winFilter2)
def retranslateUi(self, winFilter2):
_translate = QtCore.QCoreApplication.translate
winFilter2.setWindowTitle(_translate("winFilter2", "Form"))
self.btnAccept.setText(_translate("winFilter2", "Применить"))
self.btnCancel.setText(_translate("winFilter2", "Отмена"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
winFilter2 = QtWidgets.QWidget()
ui = Ui_winFilter2()
ui.setupUi(winFilter2)
winFilter2.show()
sys.exit(app.exec_())
Источник: Stack Overflow на русском